我有一个配置文件,其中的字段用分号;
分隔。类似的东西:
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
,但我不知道如何。
答案 0 :(得分:2)
首先放弃cat
和grep
的无用使用:
$ 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更喜欢sed。这里是一个就地修改文件的单行程序。
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;
>