Bash:我如何为同一个字符串的多个实例grep一行?

时间:2015-09-24 12:42:04

标签: regex bash grep

我有几行看起来像这样:

$config['upload_path'] = './media/resumes/';
$config['allowed_types'] = 'pdf|doc|docx';
$config['max_size'] = '100000';

$this->load->library('upload', $config);
if(!$this->upload->do_upload("myfile")){
$this->upload->display_errors();
}
else{
$file = $this->upload->data();
$filename = $file['file_name'];
}

在其中两行中,有{strong>两个个aaaaaaaaxzaaaaaaaaaaaaaa bbbbbbbbbbbbxzbbbbbbxzbb ccxzcccccccccccccccccxzc dddddddxzddddddddddddddd 个字符的实例。我希望grep在同一行中查找xz两次并输出它匹配的行。如果xz出现一次,我就不想知道了。

运行以下内容:

xz

告诉我xz on的所有行,但我只想看到xz出现两次的行。

如何让模式搜索在同一行重复?

3 个答案:

答案 0 :(得分:10)

您可以使用

cat lines | grep 'xz.*xz'

或者只是

grep 'xz.*xz' lines

.*将匹配2 xz之间的可选字符(除了换行符之外的任何字符)。

如果您需要使用环视,则需要-P切换以启用类似Perl的regexp。

答案 1 :(得分:4)

awk是一种方法:

awk -F'xz' 'NF==3' file

awk 'gsub(/xz/,"")==2' file

awk带给您的另一个好处是,更容易检查匹配less then n timesexact n timesgreater than n times的模式。您只需将==更改为<, <=, >, >=

即可

答案 2 :(得分:1)

如果要完整输出匹配的行,则不需要选项

grep 'xz.*xz' filename

会做