【问题标题】:Why can't extract number in a string with sed?为什么不能用 sed 提取字符串中的数字?
【发布时间】:2022-07-25 18:06:29
【问题描述】:

我可以在字符串中提取端口号:

s="2017-04-17 08:16:14 INFO     connecting lh3.googleusercontent.com:443 from 111.111.111.111:26215"
echo $s  | sed  's/\(.*\):\(\d*\)/\2/'
26215

几乎相同的知识,我想在字符串中提取“#”后面的数字:

s="alsa_output.pci-0000_09_00.6.analog-stereo.monitor/#4"
echo $s | sed   's/\#\([0-9]\)/\1/'
alsa_output.pci-0000_09_00.6.analog-stereo.monitor/4
echo $s | sed   's/#\([0-9]\)/\1/'
alsa_output.pci-0000_09_00.6.analog-stereo.monitor/4

为什么输出不是数字“4”?

【问题讨论】:

  • 你需要用.*消费整行(很多情况下,右边还需要.*)。 sed 的主要内容(当您需要保留一行的一部分时)是匹配将替换为捕获值的整行。

标签: regex sed


【解决方案1】:

您将“#4”替换为“4”,但不更改字符串的前面部分。在您的第一个示例中,“。*”正在吞噬第一部分。以此类推:

echo $s | sed 's/.*\#\([0-9]\)/\1/'

【讨论】:

    【解决方案2】:

    如果您想考虑gnu-grep,那么使用以下方法会更容易:

    s="alsa_output.pci-0000_09_00.6.analog-stereo.monitor/#4"
    grep -oP '(?<=#)\d+' <<< "$s"
    
    4
    

    或者使用awk:

    awk 'match($0, /#[0-9]+/) {print substr($0, RSTART+1, RLENGTH-1)}' <<< "$s"
    
    4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-31
      • 1970-01-01
      • 2015-06-07
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-25
      相关资源
      最近更新 更多