使用 grep(而不是 sed)搜索和替换

使用 grep(而不是 sed)搜索和替换

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

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

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

sed 搜索和替换

sed 's/old/new/' Example.txt

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

如果可能的话,请让我知道如何通过 viagrep而不是 via来完成相同的任务sed

答案1

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

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

GNUgrep添加了一个-o选项,使其sed在编辑匹配的行时执行部分工作。

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

sed 's/old/new/'

和:

pcregrep --om-separator=new  -o1 -o2 '(.*?)old(.*)'

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

XoldY
Xold
oldY

它给:

XnewY
X
Y

你可以使用更恶心的技巧来解决这个问题,例如:

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

也就是说,将\e[m(着色转义序列)添加到所有匹配行,以确保 的两侧至少有一个字符old,然后将其删除。

答案2

不,grep 无法执行替换(在一次调用中),这就是为什么明显需要 sed (后来 awk 作为一种更好的文本处理语言)。

答案3

乌格勒普,它兼容GNU grep,有一个--replace选项,所以

ugrep --replace=new old Example.txt

相当于

sed s/old/new/ Example.txt

ripgrep还有一个等效的命令行标志:

rg --replace new old Example.txt

相关内容