【问题标题】:Nested command and pipe command in shell scriptshell脚本中的嵌套命令和管道命令
【发布时间】:2015-04-27 09:22:26
【问题描述】:

我正在尝试一些测试,在下面的 shell 脚本中:

line="100:xx"
echo "$line" | grep -Po \\d+

结果:1​​00

但是,

line="100:xx"
echo `echo "$line" | grep -Po \\d+`

结果为空

为什么?

【问题讨论】:

  • echo "$line" 显示的值是否正确?怎么样:line="100:xx" echo `echo "$line" | grep -Po \\d+`
  • 因为您使用的是反引号而不是 $(),它们很烂。
  • 它在反斜杠的转义中。尝试echo `echo "$line" | grep -Po \\\\d+`echo `echo "$line" | grep -Po '\\d+'`(但请切换到$(),反引号已被弃用很长时间。)
  • 谢谢大家,@Biffen 的工作方式对我来说是正确的

标签: bash shell grep nested


【解决方案1】:

因为反引号允许像双引号字符串这样的扩展,所以你的一个反斜杠被吃得太早了:

$ echo `echo "$line" | grep -Po \\d+ | cat`

$ echo `echo "$line" | grep -Po \\\d+`
100

话虽如此,只需引用正则表达式

$ echo `echo "$line" | grep -Po '\d+'`
100

【讨论】:

  • 在正则表达式周围使用单引号是可行的方法。
【解决方案2】:

你也可以这样做:

echo $(echo "$line" | grep -Po \\d+)

避免你的反斜杠被吃掉。

【讨论】:

  • 真的吗?与使用管道的嵌套 POSIX 相比,反引号具有更好的结果。
  • @Sandburg :停止使用反引号并开始使用 $() 。这是新标准...
最近更新 更多