【问题标题】:Bash - extract substring between 2 charactersBash - 提取两个字符之间的子字符串
【发布时间】:2018-03-05 09:28:02
【问题描述】:

字符串可能如下:

1cd9f3e7d...7b486fef4 lineage-15.1-caf-8952 -> github/lineage-15.1-caf-8952  (forced update)
8648766e0..6e7faf655  lineage-15.1-caf-8952 -> github/lineage-15.1-caf-8952
e60d05ad9..784fbae86  lineage-15.1 -> github/lineage-15.1
b651b35..673d421  lineage-15.1 -> github/lineage-15.1
0a5232e..a36e212  lineage-15.1 -> github/lineage-15.1
f94851a03e2..d2ff869bdf6  lineage-15.1 -> github/lineage-15.1
769dd0439..88d4d3adc  lineage-15.1-caf-8952 -> github/lineage-15.1-caf-8952
a0553bd5f1a..69748ff0d0f  lineage-15.1 -> github/lineage-15.1
dbe2868..ab03f89  lineage-15.1 -> github/lineage-15.1
7caf61f4e..2de89a8d9  lineage-15.1 -> github/lineage-15.1

我需要在. abd l 字符之间提取字符串。如果我对上述每个字符串执行 sed:

awk -F"[.l]" '{print $3}'

结果 - 第一个字符串为空:

6e7faf655  
784fbae86  
673d421  
a36e212  
d2ff869bdf6  
88d4d3adc  
69748ff0d0f  
ab03f89  
2de89a8d9 

如果我这样做:

awk -F"[.l]" '{print $4}'

结果 - 第一个子字符串很好,其余的被转移:

7b486fef4 
ineage-15
ineage-15
ineage-15
ineage-15
ineage-15
ineage-15
ineage-15
ineage-15
ineage-15

无论源字符串格式是什么,如何处理它以始终获得我想要的子字符串?

【问题讨论】:

    标签: bash substring text-extraction


    【解决方案1】:
    $ grep -oP '(?<=\.\.)\w+' file 
    7b486fef4
    6e7faf655
    784fbae86
    673d421
    a36e212
    d2ff869bdf6
    88d4d3adc
    69748ff0d0f
    ab03f89
    2de89a8d9
    

    【讨论】:

    • 这是最简单的语法,thanx
    【解决方案2】:

    选择一个你喜欢的:

    sed解决方案:

    sed -E 's/^[^.]+\.{1,}([^.[:space:]]+).*/\1/' file
    

    awk解决方案:

    awk '{ sub(/.*\.{1,}/, "", $1); print $1 }' file
    

    输出:

    7b486fef4
    6e7faf655
    784fbae86
    673d421
    a36e212
    d2ff869bdf6
    88d4d3adc
    69748ff0d0f
    ab03f89
    2de89a8d9
    

    【讨论】:

      【解决方案3】:

      修改 OP 的尝试

      $ awk -F'[.]+| ' '{print $2}' ip.txt
      7b486fef4
      6e7faf655
      784fbae86
      673d421
      a36e212
      d2ff869bdf6
      88d4d3adc
      69748ff0d0f
      ab03f89
      2de89a8d9
      
      • -F'[.]+| ' 字段分隔符是连续的点或空格字符。所以,获得第二个字段就足够了
        • 这里也可以使用-F'[. ]+'

      【讨论】:

        【解决方案4】:

        cut -d ' ' -f 1 FILE | rev | cut -d '.' -f 1 | rev

        解释:

        • 第一个cut 提取第一部分(直到第一个空格)。
        • 我们使用rev,所以每一行都颠倒了,所以最后一个字段现在是第一个。
        • 然后我们再次使用cut 提取第一列直到. 字符。
        • 最后rev 再次恢复正确的字符顺序。

        【讨论】:

          猜你喜欢
          • 2020-10-15
          • 2012-07-07
          • 1970-01-01
          • 2013-01-31
          • 2013-12-11
          • 1970-01-01
          • 2021-01-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多