使用 grep(非 sed)搜索和替换

Cha*_*ell 1 grep sed

我一直在阅读sed并发现它是从grep命令演变而来的。

根据https://en.wikipedia.org/wiki/Sed

sed 首次出现在第 7 版 Unix 中,是为数据文件的命令行处理而构建的早期 Unix 命令之一。它演变为流行的 grep 命令的自然继承者。最初的动机是替代 grep (g/re/p) 的类似物,因此是“g/re/s”。

sed 搜索和替换

sed 's/old/new/' Example.txt
Run Code Online (Sandbox Code Playgroud)

因此,我想知道是否grep可以像sed.

如果可能,请让我知道如何通过 完成相同的操作grep,而不是通过sed

Sté*_*las 6

grep只是为了(并且只是最初)打印(ing)匹配模式的行。这就是grep意思(基于g/re/p ed命令)。

现在,一些grep实现添加了一些功能,这些功能稍微影响了其他命令的作用。例如,一些有一些-r/ --include/--exclude执行的部分find的工作。

GNUgrep添加了一个-o选项,使其执行部分sed工作,因为它可以编辑匹配的行。

pcregrep-o1, -o2...扩展它以打印捕获组匹配的内容。因此,使用该实现,即使它不是为此设计的,您实际上也可以替换:

sed 's/old/new/'
Run Code Online (Sandbox Code Playgroud)

和:

pcregrep --om-separator=new  -o1 -o2 '(.*?)old(.*)'
Run Code Online (Sandbox Code Playgroud)

但是,如果捕获组与空字符串匹配,则无法正常工作。在像这样的输入上:

XoldY
Xold
oldY
Run Code Online (Sandbox Code Playgroud)

它给:

XnewY
X
Y
Run Code Online (Sandbox Code Playgroud)

你可以使用更讨厌的技巧来解决这个问题,比如:

PCREGREP_COLOR= pcregrep --color=always '.*old.*' |
  pcregrep --om-separator=new -o1 -o2 '^..(.+?)old(.+)..' |
  pcregrep -o1 '.(.*).'
Run Code Online (Sandbox Code Playgroud)

也就是说,\e[m在所有匹配的行前添加和附加(着色转义序列)以确保 的任一侧至少有一个字符old,然后将它们剥离。