如何使用sed的行号替换字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用sed的行号替换字符串相关的知识,希望对你有一定的参考价值。

我的文件包含这样的数据:

A foo(a)
A foo(a)
B foo(b)
A foo(a)
B foo(b)

我想让他们转换成

A foo(a1)
A foo(a2)
B foo(b3)
A foo(a4)
B foo(b5)

目前,我认为使用带行号($)的IF的方法,以及用sed替换的sed。但是,我不知道该怎么做。

答案

Perl救援!

perl -pe 's/)$/$.)/' -- input
  • -p逐行读取输入并在处理后打印每一行
  • s///的工作方式与sed相似
  • $.是一个包含输入行号的特殊变量

Sed可以与nl结合使用以获得行号:

nl input | sed -E 's/^ *([^ 	]+)	(.*))/21)/'

(可能不起作用,取决于nl和sed的实际实现,可能需要调整。)

另一答案

你可以试试2 sed

sed '=' infile | sed -E 'N;y/
/ /;s/([0-9]*) ([^)]*)(.*)/213/'
另一答案

当你只想使用sed时,你只会得到一个丑陋的解决方案

sed = inputfile | sed -r 'N;s/
/ /;s/([0-9]*) (.*))/21)/'

当您使用其他工具进行编号时,您将获得更多可能性。

当你想要sed做很多工作时,你可以使用

cat -n inputfile | sed -r 's/ *([0-9]*)	(.*))/21)/'

这仍然很难读,你最好通过剥离最后一个字符并添加数字和)

sed 's/.$//' inputfile | awk '{print $0 NR ")" }'

最后一个命令可以用纯awk解决方案代替

awk '{sub(/.$/,NR")")}1' inputfile 

以上是关于如何使用sed的行号替换字符串的主要内容,如果未能解决你的问题,请参考以下文章

sed编辑命令

sed命令在文件中替换、插入

sed

sed指定某行插入追加全局替换

如何用sed命令替换一行中的某个字符串

用 sed 替换文件中最后出现的文本