如何在管道上使用“ sed”


34

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

$ npm info webpack | grep version 

它输出我

$ version: '2.1.0-beta.12',

但我想拥有:

$ 2.1.0-beta.12

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

$ npm info webpack | grep version: | sed s/version: /
sed: -e expression #1, char 10: unterminated `s' command

如何实现我的目标?

Answers:


30

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

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

例:

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

备选:使用awk

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

npm info webpack | awk -F"[ ',]+" '/version:/{print $2}'

例:

$ echo  "version: '2.1.0-beta.12'," | awk -F"[ ',]+" '/version:/{print $2}'
2.1.0-beta.12

怎么运行的:

  • -F"[ ',]+"

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

  • /version:/{print $2}

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


2
-E选项显然意味着要使用ERE语法,但我的GNU sed 4.2.2手册仅提及-r-E可以,但是!
Law 29'8

2
@ Law29是的。但是,对于所有相当现代的GNU sed,-E都是的未记录同义词-r。有传言称POSIX已确定-E使用BSD / OSX已经使用的POSIX ,并且如果将其添加到最终标准中,我们都将过渡到-E
John1024 '16

6

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

$ npm info webpack | grep 'version:' | sed 's/version: //'

这将为您提供结果'2.1.0-beta.12',,而这并不是您想要的。

由于from的输出grep非常简单,因此您可以cut与定界符'一起使用以获取行的第二个字段(无需复杂的正则表达式):

$ npm info webpack | grep -F 'version:' | cut -d "'" -f 2

这会给你2.1.0-beta.12

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


1

首先,您可以尝试使用sed

npm info webpack | grep version: | sed 's/version: //'

或者您可以使用awk

npm info webpack | grep version: | awk '{print $2}'

这可能更容易。

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.