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选项。我们将对此进行更多探讨。