如何让sed从标准输入读取内容?

124

我正在尝试

grep searchterm myfile.csv | sed 's/replaceme/withthis/g'

并获取

unknown option to `s'

我做错了什么?

编辑:

根据评论,代码实际上是正确的。我的完整代码类似于以下内容:

grep searchterm myfile.csv | sed 's/replaceme/withthis/g'
# my comment

看起来由于某种原因我的评论被作为输入喂给了sed,非常奇怪。


您是否想要用“withthis”替换掉文件中的“replacename”? - Teja
2
不,那不是你想要的。还有其他东西缺失。 - Ignacio Vazquez-Abrams
7
我最好的猜测是,在你的实际情况中,replacemewiththis中有一个/。尝试使用:'s#replaceme#withthis#g' - cababunga
4
你做错的一件事就是没有准确地展示你正在执行什么。你展示的代码没问题,但是你执行的内容有问题,所以你没有向我们展示你正在执行什么。大多数时候我们不能调试看不到的东西。有时候我们会猜对,但我们不应该去猜或靠运气。 - Jonathan Leffler
1
grep 的使用是无用的。使用 sed,你可以这样做:sed '/searchterm/s/pattern/replacement/g' myfile.csv - William Pursell
5个回答

162

使用 --expression 选项

grep searchterm myfile.csv | sed --expression='s/replaceme/withthis/g'

+SOaddict,这只是将输出发送到标准输出流,它不会更改myfile.csv文件。 - Josiah
1
如果您想要对文件进行原地更新,我认为我的答案已经解决了这个问题。 - Wes
2
任何类似于 grep 'x' y | sed 'z' 的代码都可以重构为 sed '/x/z' y。参见无用的使用 grep - tripleee
大多数开发人员不会知道如何以缩写方式完成某些操作,因为他们可能也不知道如何以正常方式完成该操作。 - Wes

63

使用“-e”来指定sed表达式

cat input.txt | sed -e 's/foo/bar/g'

1
我在想如何使用“-e”来指定sed表达式,以使sed从stdin读取?sed默认会从stdin读取吗? - Tim
1
是的,像大多数Unix工具一样,如果没有输入文件,sed将从stdin读取。 - umläute
谢谢。-e有必要吗?没有加-e也能工作。我想知道使用-e的目的是什么?谢谢。 - Tim
2
我不确定我理解 OP 的问题。echo foo | sed 's/foo/bar/g' 可以在没有 -e 的情况下工作,输出 bar。所以我一定错过了他的问题。 - Tim
1
如果只有一个脚本语句,则无需指定“-e”。如果有两个,则可以使用“sed -e'/ foo /!d' -e's// bar / g'”或“sed's / foo!d; s // bar / g'”(或等效地,换行符而不是分号)。 - tripleee
显示剩余2条评论

7
为了让sed从标准输入中捕获,而不是从文件中捕获,您应该使用-e。就像这样:
curl -k -u admin:admin https://$HOSTNAME:9070/api/tm/3.8/status/$HOSTNAME/statistics/traffic_ips/trafc_ip/ | sed -e 's/["{}]//g' |sed -e 's/[]]//g' |sed -e 's/[\[]//g' |awk  'BEGIN{FS=":"} {print $4}'

从我看到的情况来看,-e与输入重定向无关。相反,您使用-e将消除多次调用sed的需求。您可以独立于-e管道输出。 - Brian

3

如果你想在文件中进行原地文本更新,我认为这对于思考会更容易些。

grep -Rl text_to_find directory_to_search 2>/dev/null | while read line; do  sed -i 's/text_to_find/replacement_text/g' $line; done


-21
  1. 使用 vi myfile.csv 命令打开文件
  2. 按下 Escape
  3. 输入 :%s/replaceme/withthis/
  4. 输入 :wq 并按下 Enter

现在您的文件中将会有新的模式。


12
OP 想知道如何使用 sed 而不是 vim。 - Noe Nieto
1
诺伊所说的话。此外,你的vim解决方案不如sed的替代方案易于脚本化。 - weberc2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接