如何使用sed仅输出捕获的组?

17 浏览
0 Comments

如何使用sed仅输出捕获的组?

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

例如,给定输入:

This is a sample 123 text and some 987 numbers

以及模式:

/([\d]+)/

我是否可以仅以后向引用格式输出 123 和 987?

admin 更改状态以发布 2023年5月24日
0
0 Comments

Sed可以记住9个模式,但是你需要使用转义括号来记住正则表达式的部分。

这里可以看到示例和更多细节。

0
0 Comments

让这个工作起来的关键是告诉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'

这个命令表示:

  • 不要默认打印每行 (-n)
  • 排除零个或多个非数字字符
  • 包含一个或多个数字字符
  • 排除一个或多个非数字字符
  • 包含一个或多个数字字符
  • 排除零个或多个非数字字符
  • 打印替换内容 (p) (在一行中)

通常,在sed中使用圆括号捕获组,并使用反向引用输出您捕获的内容:

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

将输出“bar”。如果使用 -r -E适用于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

0