在第一次和第n次出现模式之间获取子字符串

时间:2013-02-10 11:19:32

标签: linux shell sed awk substring

我试图在linux shell中的第一个和第n个模式之间提取一个子字符串(使用sed,awk,...)。

示例字符串:

AAA_BBBB__CCC__GGGG___fffffffffffffff_hhhh

我需要在第一次出现"*_"(n连接下划线)之后的子标记,直到"*_"的第n次出现。

例如,第1次和第4​​次出现的子串的结果将是

BBBB__CCC__GGGG

使用sed,awk或其他工具最好的方法是什么?

1 个答案:

答案 0 :(得分:2)

这是使用sed的一种方式。这将选择第1次和第n次出现之间的子串。出现的数字格式为n - 1

sed 's/^[^_]\+_\+\(\(_*[^_]\+\)\{3\}\).*/\1/'

或者如果你有GNU sed

sed -r 's/^[^_]+_+((_*[^_]+){3}).*/\1/'

测试:

echo "AAA_BBBB__CCC__GGGG___fffffffffffffff_hhhh" | sed -r 's/^[^_]+_+((_*[^_]+){3}).*/\1/'

结果:

BBBB__CCC__GGGG


为了好玩,让我们说你想从任何长度的行的开头找到任意数量的组之间的子串。例如,如果您尝试的偏移量为4,长度为1,请尝试:

sed -r 's/^([^_]+_+){4}((_*[^_]+){1}).*/\2/'

结果:

fffffffffffffff

非常酷吧?