在与放在数字后面的单词匹配后,我试图提取由方括号包围的数字。例如。
文件包含
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'的未知选项
我认为这是因为更多使用/作为分隔符。
答案 0 :(得分:1)
在您决定根据条件进行打印的情况下,始终需要使用条件打印逻辑。使用-n
和p
谓词,您可以控制命令仅在匹配成功后才打印匹配的组。
因此,结合您的尝试,您需要类似的东西
sed -n 's/.*\[\([^]]*\)\][[:space:]]yyyy.*/\1/p'
在yyyy
字符串之后的[..]
以外的其他情况下将不会打印。
但是,如果您决定使用awk
来解析空格分隔的文件是很容易的,其中结果可以简单地写为
awk '$3 == "yyyy" { gsub(/[][]/,"",$2); print $2 }'
答案 1 :(得分:0)
标记grep后,如果可以使用gnu grep,另一种选择是利用-P
选项Perl-compatible regular expression
并使用环顾四周:
grep -Po "(?<=\[)\d+(?=\] yyyy)" str.txt
那会给你098
答案 2 :(得分:0)
如果“ d”中的数据尝试了gnu sed
sed -E 's/.*xxxx\s*\[(098)\]\s*yyyy.*/\1/' d