sed替代品并显示行号

Xenakaaii

我正在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章