我一直在阅读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
。
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
,然后将它们剥离。