【问题标题】:What is the meaning of the -F option in grep manualgrep手册中的-F选项是什么意思
【发布时间】:2024-01-14 02:38:01
【问题描述】:

-Fgrep 的一个选项,来自以下手册:

将模式解释为固定字符串的列表,由 换行符,其中任何一个都将被匹配

我的问题是

  1. 如何分隔多个固定字符串,换行符是什么,\n\
  2. 如果我想查找以字符ah 开头的行,grep -F a\nh file 似乎无效。

提前致谢!

【问题讨论】:

    标签: regex linux grep command-line-interface


    【解决方案1】:

    grep 中,-F 将导致模式在字面上匹配,即不对模式进行正则表达式解释。

    \n可以输入多个模式,即换行分隔。

    并非所有 shell 默认都将\n 转换为换行符,在这种情况下您可以使用$'a\nh'

    示例:

    $ echo $'foo\nf.o\nba.r\nbaar\n'
    foo
    f.o
    ba.r
    baar
    
    $ grep -F $'f.o\nba.r' <<<$'foo\nf.o\nba.r\nbaar\n'
    f.o
    ba.r
    

    【讨论】:

    • $'...' 的解释方式与 C 字符串相同,但它是 bash 扩展。虽然 bash 不支持在字符串中解释 \n,但 dash 支持。我认为安全的电话是使用tmp_var=$(printf "hello\nworld")
    • @heemayl shell中的&lt;&lt;&lt;是什么,看来是变成标准输入之后的内容了。
    • @Tracy Exactly.. 这里称为字符串(heredoc 的子类型)检查man bash
    【解决方案2】:

    默认情况下,该模式是基本正则表达式 (BRE) 模式,但对于 -F,它将被解释为没有元字符的文字字符串。

    您也可以使用-E,它将启用扩展正则表达式 (ERE)。

    % grep -F '..' <<< $'hello\nworld\n...'
    ...
    % grep '..' <<< $'hello\nworld\n...'
    hello
    world
    ...
    

    【讨论】: