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

时间:2018-03-06 19:51:34

标签: unix 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。但是,我不知道该怎么做。

3 个答案:

答案 0 :(得分:0)

Perl救援!

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

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

nl input | sed -E 's/^ *([^ \t]+)\t(.*)\)/\2\1)/'

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

答案 1 :(得分:0)

你可以试试2 sed

sed '=' infile | sed -E 'N;y/\n/ /;s/([0-9]*) ([^)]*)(.*)/\2\1\3/'

答案 2 :(得分:0)

如果您只想使用sed,那么您只能获得一个难看的解决方案

sed = inputfile | sed -r 'N;s/\n/ /;s/([0-9]*) (.*)\)/\2\1)/'

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

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

cat -n inputfile | sed -r 's/ *([0-9]*)\t(.*)\)/\2\1)/'

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

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

最后一个命令可以用

的纯awk解决方案替换
awk '{sub(/.$/,NR")")}1' inputfile