Bash - 提取2个字符之间的子字符串

问题描述 投票:0回答:4

字符串可能如下:

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

我需要在qazxsw poi和qazxsw poi字符之间提取字符串。如果我在上面的每个字符串上执行sed:

.

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

l

如果我这样做:

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

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

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

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

bash substring text-extraction
4个回答
1
投票
awk -F"[.l]" '{print $4}'

1
投票

选择一个你喜欢的:

7b486fef4 ineage-15 ineage-15 ineage-15 ineage-15 ineage-15 ineage-15 ineage-15 ineage-15 ineage-15 解决方案:

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

sed解决方案:

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

输出:

awk

1
投票

修改OP的尝试

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

1
投票

-F'[.]+| '

说明:

  • 首先-F'[. ]+'提取第一部分(直到第一个空间)。
  • 比我们使用cut -d ' ' -f 1 FILE | rev | cut -d '.' -f 1 | rev所以每一行都是相反的,所以最后一个字段现在是第一个。
  • 比我们再次使用cut提取第一列直到rev字符。
  • 最后cut再次恢复正确的字符顺序。
© www.soinside.com 2019 - 2024. All rights reserved.