2

我有一个配置文件,其中的字段用分号分隔;。就像是:

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但我不知道如何。

4

3 回答 3

2

我更喜欢而不是。这是一个就地修改文件的单行器。

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

使用-i.bak而不是-i创建.bak后缀为 as 的备份文件。

它产生:

string11;string12;string13
string21;hello_world;string23
string31;string32;string33
于 2013-07-18T17:15:23.523 回答
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

但是,如果您只想替换string22hello_world我建议使用sed

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

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

$ sed -i 's/string22;/hello_world;/g' file
于 2013-07-18T17:10:58.910 回答
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;
> 
于 2013-07-19T07:45:33.493 回答