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

时间:2019-04-23 06:18:38

标签: 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 

用于模式匹配,并获取在该匹配之前放置的数字。但是我无法合并这两个命令。我对错误感到困惑

  

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

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

3 个答案:

答案 0 :(得分:1)

在您决定根据条件进行打印的情况下,始终需要使用条件打印逻辑。使用-np谓词,您可以控制命令仅在匹配成功后才打印匹配的组。

因此,结合您的尝试,您需要类似的东西

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