Shell 使用sed和grep命令从文件中提取带有特殊字符的数字

Shell 使用sed和grep命令从文件中提取带有特殊字符的数字,shell,sed,grep,Shell,Sed,Grep,我试图在与放在数字后面的单词匹配后提取方括号中的数字。例如 该文件包含 xxxx [098] yyyy zzzz 我需要搜索yyyy,如果它在行中匹配,我必须提取098本身 我正在尝试 sed 's/.*\[\([^]]*\)\].*/\1/g' str.txt 用于在没有模式匹配的情况下提取数字 我正在使用 sed -nr 's/.*( |^)([0-9]+) yyyy.*/\2/p' str.txt 用于模式匹配,并获取放置在该匹配之前的编号。但我无法合并这两个命令。我对这个错误感到

我试图在与放在数字后面的单词匹配后提取方括号中的数字。例如

该文件包含

xxxx [098] yyyy zzzz
我需要搜索yyyy,如果它在行中匹配,我必须提取098本身

我正在尝试

sed 's/.*\[\([^]]*\)\].*/\1/g' str.txt
用于在没有模式匹配的情况下提取数字

我正在使用

sed -nr 's/.*( |^)([0-9]+) yyyy.*/\2/p' str.txt 
用于模式匹配,并获取放置在该匹配之前的编号。但我无法合并这两个命令。我对这个错误感到困惑

sed:-e表达式#1,字符26:“s”的选项未知


我认为这是因为更多地使用了/作为分隔符。

因为您已经标记了grep,如果您可以使用gnu grep,另一个选项是使用
-p
选项
Perl兼容的正则表达式
并使用lookarounds:

grep -Po "(?<=\[)\d+(?=\] yyyy)" str.txt

grep-Po”(?在您决定按条件打印的情况下,始终需要使用条件打印逻辑。使用
-n
p
谓词,只有在匹配成功时,您才能控制命令打印匹配的组

所以结合你的尝试,你需要

sed -n 's/.*\[\([^]]*\)\][[:space:]]yyyy.*/\1/p' 
除了在
[…]
字符串之后的
yyy
之外,它不会在任何其他情况下打印

但是,如果您决定使用
awk
,在其中您的结果可以简单地写为

awk '$3 == "yyyy" { gsub(/[][]/,"",$2); print $2 }'

如果在gnu上尝试了“d”中的数据

sed -E 's/.*xxxx\s*\[(098)\]\s*yyyy.*/\1/' d

谢谢!效果很好。谢谢你建议使用-P选项。我们将对此进行更多探讨。