如何获取多个模式和数字

时间:2016-09-12 09:03:10

标签: bash grep

我有这个文件(pattern1和pattern2是固定的,但数字是randoms)

aaaa patern1[1234] bbbb cccc pattern2[5678]



jjjj patern1[9999] hhhhhhhh

我想用bash脚本

提取以下模式
pattern1[1234] pattern2[5678]

pattern1[9999]

我尝试grep -Eo 'pattern1\[[0-9]{1,4}'它适用于一种模式而不是两种模式,

3 个答案:

答案 0 :(得分:2)

$ cat ip.txt 
aaaa pattern1[1234] bbbb cccc pattern2[5678]
jjjj pattern1[9999] hhhhhhhh

$ perl -lne 'print join " ", /pattern[12]\[\d+\]/g' ip.txt
pattern1[1234] pattern2[5678]
pattern1[9999]
  • pattern[12]\[\d+\]模式提取
  • print join " ",打印以空格分隔的结果

如果要省略不包含所需图案的线条:

perl -lne 'print join " ", //g if /pattern[12]\[\d+\]/' ip.txt

答案 1 :(得分:1)

您可以使用竖线字符|来允许多种模式:

grep -oP '(patern1|pattern2)\[[0-9]{1,4}\]' file
patern1[1234]
pattern2[5678]
patern1[9999]

由于模式类似,您可以这样简化:

grep -oP 'patt?ern[12]\[[0-9]{1,4}\]' file

答案 2 :(得分:1)

$ awk '{ c=0; while ( match($0,/(patern1|pattern2)[[][^][]+[]]/) ) { printf "%s%s", (c++?OFS:""), substr($0,RSTART,RLENGTH); $0=substr($0,RSTART+RLENGTH) } if (c) print "" }' file
patern1[1234] pattern2[5678]
patern1[9999]

如果您更喜欢简洁而不是清晰度,那么请考虑这一点,使用GNU awk进行多字符RS和RT并运行相同的输入文件,如https://stackoverflow.com/a/39453928/1745001所示:

$ awk -v RS='pattern[12][[][0-9]+[]]|\n' '{$0=RT;ORS=(/\n/?x:FS)} 1' file
pattern1[1234] pattern2[5678]
pattern1[9999]