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

标签 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 或其他工具执行此操作的最佳方法是什么?

最佳答案

这是使用 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/

相关文章:

string - 删除两个字符串之间的所有行

linux - Bash 或 Awk 脚本合并 X 个字段匹配的行,同时在不匹配的字段中创建范围

linux - $_GET 在服务器上被切断,但在本地有效

python - 以格式化版本打印程序的输出

c - 如何使用 c 获取使用 dd 命令创建的文件的大小

c - 使用 execvp 连接标准输入吗?

macos - 在 mac 上创建 R 函数的键盘快捷键?

linux - 从输出命令中提取字符串

bash - 删除字符串最后一个大小写之前的所有行

java - 在 Linux 中通过脚本启动 Java 程序