我试图在linux shell中的第一个和第n个模式之间提取一个子字符串(使用sed,awk,...)。
示例字符串:
AAA_BBBB__CCC__GGGG___fffffffffffffff_hhhh
我需要在第一次出现"*_"
(n连接下划线)之后的子标记,直到"*_"
的第n次出现。
例如,第1次和第4次出现的子串的结果将是
BBBB__CCC__GGGG
使用sed,awk或其他工具最好的方法是什么?
答案 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
非常酷吧?