我的文件包含这样的数据:
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/^ *([^ \t]+)\t(.*)\)/\2\1)/'
(可能不起作用,取决于nl和sed的实际实现,可能需要调整。)
你可以试试2 sed
sed '=' infile | sed -E 'N;y/\n/ /;s/([0-9]*) ([^)]*)(.*)/\2\1\3/'
当你只想使用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