我有这个文件(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}'
它适用于一种模式而不是两种模式,
答案 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]