如何将 'sed' 与管道结合使用

如何将 'sed' 与管道结合使用

我想替换输出的字符串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

怎样才能达到我的目标?

答案1

如果您要使用 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

替换命令sed( s) 需要一个搜索模式和一个替换字符串。您只为其提供了一个搜索模式。您还应该在 shell 中正确地引用字符串:

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

这将给您结果'2.1.0-beta.12',,但它并不完全是您想要的。

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

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

这将给你2.1.0-beta.12

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

答案3

首先,您可以尝试使用sed

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

或者你可以使用awk

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

这可能更容易。

相关内容