通过shell脚本更改文件的内容

时间:2013-02-01 09:49:42

标签: linux bash shell

我有一个要求,我需要更改文件的内容,如xyz.cfg。该文件包含如下值:

group address=127.8.8.8
port=7845
Jboss username=xyz_ITR3

我希望在需要时通过shell脚本更改此内容并保存文件。更改的内容可能如下所示:

group address=127.8.7.7  
port=7822
Jboss username=xyz_ITR4

如何使用shell脚本通过用户输入或其他方式实现此目的?

5 个答案:

答案 0 :(得分:27)

如下:

#!/bin/bash

addr=$1
port=$2
user=$3

sed -i -e "s/\(address=\).*/\1$1/" \
-e "s/\(port=\).*/\1$2/" \
-e "s/\(username=\).*/\1$3/" xyz.cfg

其中$1,$2$3是传递给脚本的参数。将其保存为script.sh等文件并确保其可执行chmod +x script.sh,然后您可以像以下一样运行它:

$ ./script.sh 127.8.7.7 7822 xyz_ITR4

$ cat xyz.cfg
group address=127.8.7.7
port=7822
Jboss username=xyz_ITR4

这为您提供了基本结构,但您可能需要考虑验证输入等。

答案 1 :(得分:10)

*

#! /bin/sh
file=xyz.cfg
addr=$1
port=$2
username=$3
sed -i 's/address=.*/address='$addr'/' $file
sed -i 's/port=.*/port='$port'/' $file
sed -i 's/username=.*/username='$username'/' $file

*

我希望这对初学者来说更容易理解

答案 2 :(得分:8)

sed -i 's/something/other/g' filename.txt 

将就地编辑filename.txt,并将单词'something'更改为'other'

我认为-i可能是GNU扩展,但是如果你可以,你可以通过find,xargs等添加它。

如果您想在shell脚本中更改它,可以在命令行中获取参数并按编号引用它们,例如$ 1

编辑:

根据我的评论,下面的sudo_O答案就是你想要的例子。我将添加的是,您通常希望与多个文件进行此类匹配,跨越子目录等,因此了解find / xargs,您可以将两者结合起来。一个简单的例子就是说改变一堆.cfg文件中的子网可能是:

find -name '*.cfg' -print0 | xargs -0 -I {} sed -ie 's/\(192.168\)\.1/\1\.7/' {}

注意-print0 / -0 args找到/ xargs(对于带空格的路径/文件名非常有用),并且你必须因为shell而逃避捕获括号(在sudo的例子中也是如此)

答案 3 :(得分:0)

除了上述解决方案之外,您还应注意替换文本中的转义符。

例如,如果替换/home/user/之类的内容,则不会获得想要的结果。

要解决此问题,您可以将定界符从/更改为|。请参见下面的代码示例。

OLD="path/to/replace"
NEW="new/path"
file=file-to-search.log

sed "s|$OLD|$NEW|g" $file

答案 4 :(得分:0)

您可以按以下步骤实现-

文件 script.sh

while [ $# -gt 0 ]
do
 case "$1" in
     --group-address)
            export NEW_VAL1=$2
            shift 2
            ;;
     --port)
            export NEW_VAL2=$2
            shift 2
            ;;
     --username)
            export NEW_VAL3=$2
            shift 2
            ;;

    *)
    echo "Unrecognized option: $1"
    usage 1
    esac
done


sed -i 's/group address=.*/group address='$NEW_VAL1'/g' xyz.cfg
sed -i 's/port=.*/port=.'$NEW_VAL2'/g' xyz.cfg
sed -i 's/Jboss username=.*/Jboss username='$NEW_VAL3'/g' xyz.cfg

您现在可以通过传递各自的参数来更新这些值-

  • -组地址
  • -端口
  • -用户名

在此脚本的命令行上

例如-

./script.sh --group-address 127.8.7.7 --port  7822 --username xyz_ITR4
相关问题