如何在管道中使用“sed”

Osk*_*ura 66 bash grep sed

我想替换从 输出的字符串grep,我有:

$ npm info webpack | grep version 
Run Code Online (Sandbox Code Playgroud)

它输出我

$ version: '2.1.0-beta.12',
Run Code Online (Sandbox Code Playgroud)

但我想要:

$ 2.1.0-beta.12
Run Code Online (Sandbox Code Playgroud)

所以我想我可以使用sed并替换不必要的子字符串来实现这一点。但对我来说困难的部分是:

$ npm info webpack | grep version: | sed s/version: /
sed: -e expression #1, char 10: unterminated `s' command
Run Code Online (Sandbox Code Playgroud)

怎样才能达到我的目标?

Joh*_*024 54

如果您打算使用 sed,则无需同时使用 grep。尝试:

npm info webpack | sed -En "s/version: '(.*)',/\1/p"
Run Code Online (Sandbox Code Playgroud)

例子:

$ echo  "version: '2.1.0-beta.12'," | sed -En "s/version: '(.*)',/\1/p"
2.1.0-beta.12
Run Code Online (Sandbox Code Playgroud)

替代方案:使用 awk

同样,如果我们使用 awk,也不需要 grep:

npm info webpack | awk -F"[ ',]+" '/version:/{print $2}'
Run Code Online (Sandbox Code Playgroud)

例子:

$ echo  "version: '2.1.0-beta.12'," | awk -F"[ ',]+" '/version:/{print $2}'
2.1.0-beta.12
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

  • -F"[ ',]+"

    这告诉 awk 使用空格、单引号或逗号或其任意组合作为字段分隔符。

  • /version:/{print $2}

    如果一行包含version:,则打印第二个字段。

  • `-E` 选项显然意味着使用 ERE 语法,但我的 GNU sed 4.2.2 手册只提到了 `-r`。不过,`-E` 有效! (2认同)
  • @Law29 是的。然而,对于所有相当现代的 GNU sed,`-E` 是 `-r` 的**未记录**同义词。有传言说 POSIX 已经决定使用 BSD/OSX 已经使用的 `-E`,如果将其添加到最终标准中,我们都将过渡到 `-E`。 (2认同)

Kus*_*nda 12

sed替代命令(s)期望一个搜索模式,并作为替换字符串。您只为它提供了搜索模式。您还应该在 shell 中正确引用字符串:

$ npm info webpack | grep 'version:' | sed 's/version: //'
Run Code Online (Sandbox Code Playgroud)

这会给你结果'2.1.0-beta.12',,这不是你想要的。

由于 from 的输出grep非常简单,您可以使用cut分隔符'来获取该行的第二个字段(无需复杂的正则表达式):

$ npm info webpack | grep -F 'version:' | cut -d "'" -f 2
Run Code Online (Sandbox Code Playgroud)

这会给你2.1.0-beta.12

我还添加-Fgrep因为您搜索的字符串是固定字符串,而不是正则表达式。


Mar*_*iae 6

首先,您可以尝试使用sed

npm info webpack | grep version: | sed 's/version: //'
Run Code Online (Sandbox Code Playgroud)

或者您可以使用awk

npm info webpack | grep version: | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)

这可能更容易。