如何修改包含第二次出现的字符串的行?

如何修改包含第二次出现的字符串的行?

这篇文章解释了如何从终端在文件开头添加一行。但如果我不知道文件中的某行是哪一行,如何从终端修改它?

我应该修改这一行eni=10.*10**9eni=10.*10**8标注指数。这是第二次eni出现

答案1

我想这就是你想要的:

line=$(grep -n -m2 "eni" file | tail -n1 | cut -f1 -d:)

sed -i $line's/9$/8/' file

答案2

由于 Ubuntu 现在附带了 GNU Awk v4.0+(它提供了一个inplace模块),你可以执行以下操作

gawk -i inplace '/eni=/ {if (++c == 2) sub(/10\*\*9/,"10**8")} 1' file

您可以根据需要使正则表达式变得更具体/eni=/或更不具体。/10\*\*9/

perl 也类似

perl -i -pe 'if (/eni=/) {s/10\*\*9/10\*\*8/ if (++$c == 2)}' file

答案3

使用sed

sed -i ': 1 ; N ; $!b1 ; s/eni\=10\.\*10\*\*9/eni\=10\.\*10\*\*8/2' filename

/其中一个分隔符并且\转义字符.\用于使 bash 不会将特殊字符解释为某些命令,例如*通配符。

相关内容