如何使用sed仅输出捕获的组?
如何使用sed仅输出捕获的组?
有没有办法告诉 sed
仅输出捕获组?
例如,给定输入:
This is a sample 123 text and some 987 numbers
以及模式:
/([\d]+)/
我是否可以仅以后向引用格式输出 123 和 987?
admin 更改状态以发布 2023年5月24日
让这个工作起来的关键是告诉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 pcrepattern
或man 3 pcresyntax
。