Sed';s"+&引用;量词似乎不匹配任何东西

Sed';s"+&引用;量词似乎不匹配任何东西,sed,Sed,我有一个文件sedTest.txt,内容如下: sdjalsh ABC 123 ashfaladhs ldjkasf ABC 234 dadas afsf dafsafs ABC 876 asf dasfaf 我只想输出那些123,234,876 我可以使用 cat sedTest.txt | sed s"/.*ABC \([0-9]+\).*/\1/" 我这样使用它,因为通常是grep而不是cat,在本例中可能是 grep ABC sedTest.txt | sed s"/.*ABC \(

我有一个文件sedTest.txt,内容如下:

sdjalsh ABC 123 ashfaladhs
ldjkasf ABC 234 dadas afsf
dafsafs ABC 876 asf dasfaf
我只想输出那些
123
234
876

我可以使用

cat sedTest.txt | sed s"/.*ABC \([0-9]+\).*/\1/"
我这样使用它,因为通常是grep而不是cat,在本例中可能是

grep ABC sedTest.txt | sed s"/.*ABC \([0-9]+\).*/\1/"
这在这里没有真正的意义,但这是日志的典型用法


我想知道:为什么使用
[0-9]+
不起作用?我希望得到与
[0-9]*
相同的结果,但似乎没有任何内容被替换(并打印未更改的内容)。

+
是ERE元字符,sed默认使用BRE。使用
sed-E…+
sed…\+
启用
+
s ERE属性,例如

grep 'ABC' sedTest.txt | sed -E 's/ABC ([0-9]+).*/\1/'
请注意,当您使用
-E
并且前面的
*
没有做任何有用的事情时,您不再需要转义paren来启用它们的ERE元字符属性,因此我将其去掉。此外,您不需要grep+sed,这可以:

sed -E -n 's/ABC ([0-9]+).*/\1/p' sedTest.txt
但更重要的是,您应该真正使用:

awk '$2=="ABC"{print $3}' sedTest.txt
而是为了清晰、简单、健壮、可移植性等


请务必注意,您应该将脚本(sed、awk、grep等)括在单引号(
)中,而不是双引号(
)除非shell决定在工具看到脚本中的某些值之前解释它们,否则您会感到意外。

+
是ERE元字符,sed默认使用BRE。可以使用
sed-E…+…
sed…\+…
来启用
+
的ERE属性,例如

grep 'ABC' sedTest.txt | sed -E 's/ABC ([0-9]+).*/\1/'
请注意,当您使用
-E
时,您不再需要转义paren以启用其ERE元字符属性,并且前面的
*
没有任何用处,因此我将其删除。此外,您不需要grep+sed,这可以:

sed -E -n 's/ABC ([0-9]+).*/\1/p' sedTest.txt
但更重要的是,您应该真正使用:

awk '$2=="ABC"{print $3}' sedTest.txt
而是为了清晰、简单、健壮、可移植性等


请务必注意,您应该将脚本(sed、awk、grep等)用单引号(
)括起来,而不是用双引号(
)括起来,除非当shell决定在您的工具看到脚本中的某些值之前解释它们时,您会感到意外。

感谢您澄清这一点。您可以添加一些更详细地描述ERE/BRE的链接(或其他参考资料)。在你发完帖子后,我注意到sed手册页面上有这个首字母缩略词……不,只是用谷歌搜索一下。理解BRE/ERE是编写shell脚本的基础,为这些脚本添加链接就像添加描述“如果”和“那么”的链接一样。感谢您的澄清。您可以添加一些更详细地描述ERE/BRE的链接(或其他参考资料)。在你发完帖子后,我注意到sed手册页面上有这个首字母缩略词……不,只是用谷歌搜索一下。理解BRE/ERE是编写shell脚本的基础,为这些脚本添加链接就像添加描述“如果”和“那么”的链接一样。