使用shell脚本替换配置文件中的字符串

时间:2013-07-18 17:03:44

标签: shell sed awk

我有一个配置文件,其中的字段用分号;分隔。类似的东西:

user@raspberrypi /home/pi $ cat file  
string11;string12;string13;
string21;string22;string23;
string31;string32;string33;

我可以用awk获得我需要的字符串:

user@raspberrypi /home/pi $ cat file | grep 21 | awk -F ";" '{print $2}' 
string22

我想通过脚本将string22更改为hello_world

知道怎么做吗?我认为它应该是sed,但我不知道如何。

3 个答案:

答案 0 :(得分:2)

首先放弃catgrep的无用使用:

$ cat file | grep 21 | awk -F';' '{print $2}'

变为:

$ awk -F';' '/21/{print $2}' file

要更改此值,您可以执行以下操作:

$ awk '/21/{$2="hello_world"}1' FS=';' OFS=';' file 

将更改存储回文件:

$ awk '/21/{$2="hello_world"}1' FS=';' OFS=';' file > tmp && mv tmp file

但是,如果您要做的只是将string22替换为hello_world,我建议改为使用sed

$ sed 's/string22;/hello_world;/g' file

使用sed,您可以使用-i选项将更改存储回文件:

$ sed -i 's/string22;/hello_world;/g' file

答案 1 :(得分:2)

我比更喜欢。这里是一个就地修改文件的单行程序。

perl -i -F';' -lane '
    BEGIN { $" = q|;| } 
    if ( m/21/ ) { $F[1] = q|hello_world| }; 
    print qq|@F|
' infile

使用-i.bak代替-i创建一个后缀为.bak的备份文件。

它产生:

string11;string12;string13
string21;hello_world;string23
string31;string32;string33

答案 2 :(得分:1)

即使我们可以这样做,因为Sudo建议我更喜欢perl,因为它会进行内联替换。

perl -pe 's/(^[^\;]*;)[^\;]*(;.*)/$1hello_world$2/g if(/21/)' your_file

for in line只需添加一个i

perl -pi -e 's/(^[^\;]*;)[^\;]*(;.*)/$1hello_world$2/g if(/21/)' your_file

测试如下:

> perl -pe 's/(^[^\;]*;)[^\;]*(;.*)/$1"hello_world"$2/g if(/21/)' temp
string11;string12;string13;
string21;"hello_world";string23;
string31;string32;string33;
> perl -pe 's/(^[^\;]*;)[^\;]*(;.*)/$1hello_world$2/g if(/21/)' temp
string11;string12;string13;
string21;hello_world;string23;
string31;string32;string33;
>