我该如何读取标准输入?[重复]


90

我在尝试

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”代替您的文件名?
Teja '04

2
不,那不是您要尝试的。还有其他遗漏的东西。
伊格纳西奥·巴斯克斯

6
我最好的猜测是,在实际情况下,您有/inreplacemewiththis。试试:'s#replaceme#withthis#g'
cababunga 2012年

4
您做错的一件事就是没有向我们确切显示您正在执行的操作。您显示的代码很好;您正在执行的内容有问题;因此,您没有向我们展示您正在执行的操作。大多数时候,我们无法调试看不到的内容。有时候,我们会幸运并猜对了,但我们不必猜测或幸运。
乔纳森·勒夫勒

1
无用的grep。使用sed,您可以执行以下操作:sed'/ searchterm / s / pattern / replacement /
g'myfile.csv

Answers:


118

使用--expression选项

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

+ SOaddict,这只是输出到stdout,没有更改myfile.csv。
约西亚

1
如果您想对文件进行就地更新,我想我的答案就足以解决该问题。
Wes

任何看起来像的东西grep 'x' y | sed 'z'都可以重构为sed '/x/z' y。另请参见无用grep
三人房

39

使用“ -e”指定sed-expression

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

1
我想知道如何使用“ -e”指定sed-expression来使sed从stdin读取?sed默认情况下是否从stdin读取?
蒂姆(Tim)

1
是。像大多数un * x工具一样,sed如果没有输入文件,则从stdin读取。
umläute

谢谢。有-e必要吗?它没有工作-e。我想知道使用的目的是-e什么?谢谢。
蒂姆(Tim)

2
我不确定我是否了解OP问题。通过输出echo foo | sed 's/foo/bar/g'可以不工作。所以我一定错过了他的问题。-ebar
蒂姆(Tim)

无需指定-e是否只有一个脚本语句。如果您有两个,则可以说sed -e '/foo/!d' -e 's//bar/g'sed 's/foo!d;s//bar/g'(或等效地,用换行符代替分号)。
三人房

6

要从sedstdin(而不是文件)捕获数据,应使用-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}'

2

如果您尝试对文件中的文本进行就地更新,那么在我看来,这样做就容易多了。

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


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

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


11
OP希望知道如何使用sed而不是vim来实现。
Noe Nieto

1
Noe说了什么。另外,您的vim解决方案不如sed替代方案可靠,因为它不是(容易)编写脚本的。
weberc2 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.