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