字符串中的grep multipe通配符

Mik*_*e D 5 linux shell grep

假设我有一个包含以下内容的文件:

Release 2.1 OS: RHEL File: package_el6_2.0.1.1_x86_64.rpm
Release 2.1 OS: RHEL File: package_el6_2.0.1.1_i686.rpm
Release 2.1 OS: RHEL File: package_el7_2.0.1.1_x86_64.rpm
Release 2.1 OS: RHEL File: package_el7_2.0.1.1_i686.rpm
Run Code Online (Sandbox Code Playgroud)

我想grep和匹配只包含'package','el6'和'x86_64'的行

我将如何使用grep在一个内衬上进行此操作?该行必须匹配所有三个,grep不应该关心它们之间有多少个字符.如果有一个更好的工具,我很乐意使用它.

我尝试了以下内容并没有得到任何结果:

grep package*el6*x86_64*
Run Code Online (Sandbox Code Playgroud)

看到帖子和文档,我知道*并不意味着与shell中的相同.我正在寻找相当于在正则表达式中使用它.希望这是有道理的.

Mad*_*ist 6

你的尝试非常接近.*在shell中,glob术语大致相当于.*正则表达式..表示"任何字符",*表示"重复任意次数(包括零)".

你的正则表达式只需要.在每个之前*.尾随*没有必要:

package.*el6.*x86_64
Run Code Online (Sandbox Code Playgroud)

以下是您输入的示例运行:

grep 'package.*el6.*x86_64' <<< "Release 2.1 OS: RHEL File: package_el6_2.0.1.1_x86_64.rpm
Release 2.1 OS: RHEL File: package_el6_2.0.1.1_i686.rpm
Release 2.1 OS: RHEL File: package_el7_2.0.1.1_x86_64.rpm
Release 2.1 OS: RHEL File: package_el7_2.0.1.1_i686.rpm"
Run Code Online (Sandbox Code Playgroud)

打印:

Release 2.1 OS: RHEL File: package_el6_2.0.1.1_x86_64.rpm
Run Code Online (Sandbox Code Playgroud)

  • 具体来说,它应该是:`grep'package.*el6.*x86_64'`.否则,shell甚至可以将操作视为失败而不运行`grep`(如果设置了`failglob`选项),或者将表达式替换为当前目录中与正则表达式匹配时解释为glob的文件名列表,或者直接删除该参数(如果设置了`nullglob`选项). (4认同)
  • 需要更多引号以防止shell将该参数视为glob的任何可能性. (2认同)