在同一个文件shell中替换并存储一个值

时间:2017-10-15 12:23:30

标签: bash shell

如何替换列的值并将输出存储到同一个文件中?

示例输入,文件:

 #car|year|model
 toyota|1998|corrola
 toyota|2006|yaris
 opel|2001|corsa

将“corrola”替换为“corrolacoupe” 并将其存储到输入文件

#car|year|model
toyota|1998|corrolacoupe
toyota|2006|yaris
opel|2001|corsa

我试过这个

awk -F '|' -v col=$column -v val=$value '/^[^#]/ FNR==NR  {print $col = val }' OFS='|'  $FILE >> $FILE

3 个答案:

答案 0 :(得分:0)

只需(row,col) 中的值替换为新值:

$ awk -F'|' -v OFS='|' -v row=2 -v col=3 -v val=corollacoupe 'NR==row {$col=val} 1' file 
#car|year|model
toyota|1998|corollacoupe
toyota|2006|yaris
opel|2001|corsa

这会将输入字段col的值设置为val,但仅限于输入记录row。最后的1将确保默认打印每条记录。输入和输出字段分隔符通过-F选项和OFS变量设置。

如果您需要进行这些就地更改,请创建一个临时输出文件,然后将其复制到原始文件上:

$ awk ... file >file.tmp && cp file{.tmp,}

或者,在 GNU awk 中,您可以通过inplace选项使用 -i inplace

$ awk -i inplace -F'|' -v OFS='|' -v row=2 -v col=3 -v val=corollacoupe 'NR==row {$col=val} 1' file 

如果您希望跳过评论,并且只计算非评论行:

$ awk -F'|' -v OFS='|' -v row=1 -v col=3 -v val=x '/^[^#]/ {nr++} nr==row {$col=val} 1' file 
#car|year|model
toyota|1998|x
toyota|2006|yaris
opel|2001|corsa

答案 1 :(得分:0)

在没有任何临时文件的情况下就地修改文件的ed解决方案可能类似于:

ed "$FILE" <<< $',s/|corrola$/|corrolacoupe/g\nw'

使用ANSI-C字符串来防止特殊字符被处理,然后在任何行的末尾匹配|corrola并用|corrolacoupe替换它。然后我们向w发出ed命令,让它将文件写回

答案 2 :(得分:0)

一个非常简单的解决方案。

darby@Debian:~/Scrivania$ cat file
#car|year|model
toyota|1998|corrola
toyota|2006|yaris
opel|2001|corsa
darby@Debian:~/Scrivania$ sed -ri 's@^(.+)\|(.+)\|corrola$@\1|\2|corrolacoupe@' file
darby@Debian:~/Scrivania$ cat file
#car|year|model
toyota|1998|corrolacoupe
toyota|2006|yaris
opel|2001|corsa
darby@Debian:~/Scrivania$