我正在bash中尝试sed
在文件上使用替换,并显示替换发生的行号和该行的最终版本。对于行包含foo的文件,请尝试
sed -n 's/foo/bar/gp' filename
将向我显示发生替换的行,但是我不知道如何包括行号。如果我尝试=
用作标记来打印当前行号,例如
sed -n 's/foo/bar/gp=' filename
我懂了
sed: -e expression #1, char 14: unknown option to `s'
我可以awk
像这样完成目标
awk '{if (sub("foo","bar",$0)){print NR $0}}' filename
但我很好奇是否有一种方法可以使用一行sed
。如果可能的话,我很乐意使用sed
不带管道的单个语句。
我想不出没有两次列出搜索模式并使用命令分组的方法。
sed -n "/foo/{s/foo/bar/g;=;p;}" filename
编辑:mklement0帮我在那里通过提的是,如果模式空间是空的,默认模式空间是所使用的最后一个,如前所述手册中。因此,您可以像这样摆脱它:
sed -n "/foo/{s//bar/g;=;p;}" filename
在此之前,我想出了一种不重复模式空间的方法,但是它使用分支和标签。“在大多数情况下,”文档指出,“使用这些命令表明您可能会更喜欢使用awk或Perl之类的程序。但是偶尔有人会坚持使用sed,这些命令可使一个人写的很复杂脚本。” [来源]
sed -n "s/foo/bar/g;tp;b;:p;=;p" filename
这将执行以下操作:
s/foo/bar/g
请您替补。tp
:p
如果发生替代,将跳至。b
(无标签的分支)将处理下一行。:p
定义label p
,这是tp
上面命令的目标。=
并p
先打印行号,再打印行。看到?可读性差得多……也许是远亲:(){ :|:& };:
。:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句