我正试图在 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
很酷吧?
关于linux - 获取模式第一次出现和第 n 次出现之间的子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14797146/