gpt4 book ai didi

regex - 如何使用 sed 只输出捕获的组?

转载 作者:行者123 更新时间:2023-12-03 04:04:58 24 4
gpt4 key购买 nike

有没有办法告诉 sed 仅输出捕获的组?

例如,给定输入:

This is a sample 123 text and some 987 numbers

和模式:

/([\d]+)/

我能否以反向引用格式化的方式仅获得 123 和 987 输出?

最佳答案

让它发挥作用的关键是告诉 sed 排除您不想输出的内容并指定您想要的内容。此技术取决于了解您要查找的匹配项数量。下面的 grep 命令适用于未指定数量的匹配。

string='This is a sample 123 text and some 987 numbers'
echo "$string" | sed -rn 's/[^[:digit:]]*([[:digit:]]+)[^[:digit:]]+([[:digit:]]+)[^[:digit:]]*/\1 \2/p'

这说:

  • 使用扩展正则表达式 (-r)
  • 不要默认打印每一行 (-n)
  • 排除零个或多个非数字
  • 包含一位或多位数字
  • 排除一个或多个非数字
  • 包含一位或多位数字
  • 排除零个或多个非数字
  • 打印替换内容 (p)(在一行上)

一般来说,在 sed 中,您使用括号捕获组并使用反向引用输出捕获的内容:

echo "foobarbaz" | sed 's/^foo\(.*\)baz$/\1/'

将输出“bar”。如果您使用 -r (-E for OS X)作为扩展正则表达式,则不需要转义括号:

echo "foobarbaz" | sed -r 's/^foo(.*)baz$/\1/'

最多可以有 9 个捕获组及其反向引用。后面的引用按照组出现的顺序进行编号,但它们可以按任何顺序使用并且可以重复:

echo "foobarbaz" | sed -r 's/^foo(.*)b(.)z$/\2 \1 \2/'

输出“a bar a”。

如果您有 GNU grep:

echo "$string" | grep -Po '\d+'

它也可以在 BSD 中运行,包括 OS X:

echo "$string" | grep -Eo '\d+'

这些命令将匹配任意数量的数字序列。输出将分为多行。

或变体,例如:

echo "$string" | grep -Po '(?<=\D )(\d+)'

-P 选项启用 Perl 兼容正则表达式。请参阅man 3 pcrepatternman 3 pcresyntax .

关于regex - 如何使用 sed 只输出捕获的组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2777579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com