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



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

示例输入,文件:

 #car|year|model
 toyota|1998|corrola
 toyota|2006|yaris
 opel|2001|corsa
将"科罗拉"

改为"科罗拉库佩"并将其存储到输入文件中

#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
只需将

(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

没有任何临时文件的情况下就地修改文件的ed解决方案可能是这样的:

ed "$FILE" <<< $',s/|corrola$/|corrolacoupe/gnw'

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

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

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$

最新更新