我有一个temp
文件,我想要grep
唯一与模式匹配的单词而不是整个单词。我尝试过grep -o <pattern> file
,但它没有给我想要的输出
输入
xi29 vddf vss vddf vss int_s s2 rstb mg91a02_l_nd2_bulk_vt1 ln1=16n ln2=16n lp1=16n lp2=16n nf_n1=1 nf_n2=1 nf_p1=1 nf_p2=1
xi28 vddf vss vddf vss d1 d mg91a02_l_inv_bulk_vt1 ln=16n lp=16n nf_n=1 nf_p=1 nfin_n=2 nfin_p=2 m=1
xi25 vddf vss vddf vss int_m2 int_m1 mg91a02_l_inv_bulk_vt1 ln=16n lp=16n nf_n=1 nf_p=1
命令
grep -o 'mg91a02' temp
输出(获得)
mg91a02
mg91a02
mg91a02
输出(所需)
mg91a02_l_nd2_bulk_vt1
mg91a02_l_inv_bulk_vt1
mg91a02_l_inv_bulk_vt1
答案1
尝试
grep -E -o 'mg91a02\w+'
在哪里
-E
: 扩展正则表达式-o
只打印匹配的单词\w
:单词字符(字母数字或下划线,同义词[_[:alnum:]]
)。+
一次或多次
对于非空白字符,以便@
根据注释捕获字符串,请参阅\S
(缩写[^[:space:]]
)
grep -E -o 'mg91a02\S+'
通过OP编辑后的输入,这会导致
mg91a02_l_inv_bulk_vt1
mg91a02_l_nd2_bulk_vt1
mg91a02_l_nd2_@bulk!_vt1
mg91a02_l_nd2_[bulk]_vt1
mg91a02_l_inv_bulk_vt1
请注意-o
, 、\w
和\S
是非标准扩展。
答案2
grep -o 'mg91a02[^ ]*' file
这意味着打印模式mg91a02
直到看不到^
第一个空格([^ ]
)或意味着打印所有不是空格的内容。
答案3
使用 Perl 正则表达式:
grep -Po '\w*mg91a02\w*'
例如:
$ grep -Po top .zshrc
top
top
top
top
top
top
top
$ grep -Po '\w*top\w*' .zshrc
setopt
setopt
autopushd
setopt
setopt
setopt
setopt