将stdin和管道打到sed似乎不起作用

时间:2012-05-14 10:03:12

标签: grep replace

我正在尝试过滤和替换标准输入,以便仅捕获调整到我的风格的特定字符串。例如,假设标准输入字符串是

"KB: the system ran into a critical error" 

然后我会grep这一行,将“KB:”改为“###”,然后输出到STDOUT,这样

"### the system ran into a critical error"

我在Fedora 12中尝试过(实际上在许多其他人中)

$ grep "KB:" - | sed -e 's/KB:/###/g'
KB: the system ran into a critical error <--- This is what I typed in manually.
                                         <--- Nothing is printed

我创建了一个文本文件text.txt,其中包含相同的示例字符串,然后从文件中读取grep,如:

$ grep "KB:" text.txt | sed -e 's/KB:/###/g'
### the system ran into a critical error <--- Correctly displayed
$

grep/sed的内部和STDIN方法不起作用的原因会有什么不同?而不是听说使用xargs等替代方案,我想知道为什么我的尝试应该失败。

1 个答案:

答案 0 :(得分:5)

这对我有用:

echo "KB: the system ran into a critical error" | grep "KB:" | sed -e 's/KB:/###/g'

请注意在-命令中排除grep字符。

使用grep在这里毫无用处。您可以将代码缩小到适当大小:

echo "KB: the system ran into a critical error" | sed -e 's/KB:/###/g'
    ### the system ran into a critical error