Sed用行号替换模式

gha*_*hel 7 awk sed gawk

我需要###用当前行号替换模式.

我设法在AWK和SED的下一行打印.

sed -n "/###/{p;=;}" file打印到下一行,没有p;,它取代整行.

sed -e "s/###/{=;}/g" file过去在我脑海中有意义,因为=;返回匹配模式的行号,但它会返回文本{=;}

我想念的是什么?我知道这是一个愚蠢的问题.我在sed手册中找不到这个问题的答案,现在还不是很清楚.

如果可能的话,请指出我错过了什么,以及让它成功的原因.谢谢

twa*_*erg 8

简单的awkoneliner:

awk '{gsub("###",NR,$0);print}'
Run Code Online (Sandbox Code Playgroud)


Lev*_*sky 5

鉴于命令的局限性=,我认为将工作分成两部分(实际上是三部分)更容易。使用 GNU,sed您可以:

$ sed -n '/###/=' test > lineno
Run Code Online (Sandbox Code Playgroud)

然后像

$ sed -e '/###/R lineno' test | sed '/###/{:r;N;s/###\([^\n]*\n\)\([^\n]*\)/\2\1/;tr;:c;s/\n\n/\n/;tc}'
Run Code Online (Sandbox Code Playgroud)

恐怕没有简单的方法,sed因为除了=命令之外,rGNU 扩展R命令不会将文件读入模式空间,而是直接将行附加到输出中,因此文件的内容不能以任何方式修改。因此管道到另一个sed命令。

如果内容test

fooo
bar ### aa
test
zz ### bar
Run Code Online (Sandbox Code Playgroud)

以上将产生

fooo
bar 2 aa
test
zz 4 bar
Run Code Online (Sandbox Code Playgroud)