【问题标题】:How do I get sed to read from standard input? [duplicate]如何让 sed 从标准输入中读取? [复制]
【发布时间】:2019-05-10 23:50:08
【问题描述】:

我在努力

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

得到

unknown option to `s'

我做错了什么?

编辑:

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

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

似乎出于某种原因,我的评论被作为输入提供给 sed。很奇怪。

【问题讨论】:

  • 你想用'withthis'替换你的文件来代替replacename吗?
  • 不,这不是你想要的。还有一些东西不见了。
  • 我最好的猜测是,在您的真实情况下,您在replaceme 或withthis 中有一个/。试试:'s#replaceme#withthis#g'.
  • 您做错的一件事是没有向我们准确展示您正在执行的操作。您显示的代码很好;你的执行有问题;因此,您没有向我们展示您正在执行的操作。大多数时候,我们无法调试我们看不到的东西。有时,我们会很幸运并且猜对了,但我们不应该猜测或幸运。
  • 无用的grep。使用 sed,您可以: sed '/searchterm/s/pattern/replacement/g' myfile.csv

标签: linux bash shell


【解决方案1】:

使用 --expression 选项

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

【讨论】:

  • +SOaddict,这只是输出到标准输出,它不会改变 myfile.csv。
  • 如果您想对文件进行就地更新,我认为我的回答足以解决该问题。
  • 任何看起来像grep 'x' y | sed 'z' 的东西都可以重构为sed '/x/z' y。另见useless use of grep.
  • 大多数开发人员不会知道用一种他们可能也不知道如何长期使用的语言做某事的速记方法
【解决方案2】:

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

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

【讨论】:

  • 我想知道如何使用“-e”来指定 sed 表达式可以让 sed 从标准输入读取? sed 默认从标准输入读取吗?
  • 是的。像大多数 un*x 工具一样,sed 在不存在输入文件时从标准输入读取。
  • 谢谢。 -e 有必要吗?它可以在没有-e 的情况下工作。我想知道使用-e 的目的是什么?谢谢。
  • 我不确定我是否理解 OP 的问题。 echo foo | sed 's/foo/bar/g' 在没有 -e 的情况下工作,通过输出 bar。所以我一定错过了他的问题。
  • 如果您只有一个脚本语句,则无需指定-e。如果你有两个,你可以说sed -e '/foo/!d' -e 's//bar/g' 或sed 's/foo!d;s//bar/g'(或者等效地,用换行符代替分号)。
【解决方案3】:

要使 sed 从 stdin 中捕获,而不是从文件中捕获,您应该使用 -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}'

【讨论】:

    【解决方案4】:

    如果您尝试对文件中的文本进行就地更新,我认为这更容易推理。

    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
    
    

    【讨论】:

      【解决方案5】:
      1. 使用vi myfile.csv打开文件
      2. 按 退出
      3. 输入:%s/replaceme/withthis/
      4. 键入:wq 并按Enter

      现在您的文件中将包含新模式。

      【讨论】:

      • OP 想知道如何使用 sed 而不是 vim。
      • 诺伊所说的。此外,您的 vim 解决方案不如 sed 替代方案,因为它不是(容易)可编写脚本的。
      猜你喜欢
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 2010-11-29
      相关资源
      最近更新 更多