我一直在阅读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 作为一种更好的文本处理语言)。