【问题标题】:Grep a whole whitespace-separated word in bash在 bash 中用空格分隔一个完整的单词
【发布时间】:2021-01-22 16:54:21
【问题描述】:

假设我有这些数据:

hi helo tmp#100000 bye
100000 hi bye
hi 100000 bye

100000 在变量中:$var 我只想 grep 100000 作为一个完整的单词,所需的输出:

100000 hi bye
hi 100000 bye

我已经尝试了所有在 StuckOverflow 中得到解答的东西,但似乎没有任何效果: grep "\b$var\b", grep -E "[[:blank:]]$var[[:blank:]]" 等等。 我认为问题可能出在#。 该解决方案需要适用于变量等于:hi.*bye 作为正则表达式的情况。

请帮忙

【问题讨论】:

  • 使用grep -E "(^|[[:blank:]])$var($|[[:blank:]])"
  • 这可能会有所帮助:The Stack Overflow Regular Expressions FAQ
  • grep -Fw "$var"grep -P "\\b$var\\b" 将起作用除了 # 不是“单词字符”,因此单词边界匹配#1

标签: regex unix awk grep


【解决方案1】:

使用awk的非正则表达式搜索:

awk -v var="$var" '
{for (i=1; i<=NF; ++i) if ($i == var) {print; break}}' file
100000 hi bye
hi 100000 bye

否则使用自定义 FS 的 awk 更短:

awk -F "(^|[[:blank:]])$var([[:blank:]]|$)" 'NF > 1' file

【讨论】:

    【解决方案2】:

    你可以使用

    grep -E "(^|[[:blank:]])$var($|[[:blank:]])"
    

    或者,假设它是 GNU grep(如 suggested by Glenn Jackman):

    grep -P '(?<!\S)\Q'"$var"'\E(?!\S)'
    

    如果您的$var 包含文字 以搜索并且 $var 可以保存包含特殊正则表达式元字符(如()的值,请选择第二个, )[{+^等,见What special characters must be escaped in regular expressions?an online demo:

    s='hi helo tmp#100000 bye
    100000 hi bye
    hi 100000 bye'
    var=100000
    grep -E "(^|[[:blank:]])$var($|[[:blank:]])" <<< "$s"
    # => 100000 hi bye
    #    hi 100000 bye
    

    这里,

    • -E 启用 POSIX ERE 语法,-P 启用 PCRE 语法
    • (^|[[:blank:]]) - 匹配输入的开头或水平空格
    • (?&lt;!\S)\Q - (?&lt;!\S) 检查左边的字符是否是空格或字符串开头,\Q 开始引用该模式,$var 将被解析为文字文本
    • $var - var 内容
    • ($|[[:blank:]]) - 匹配输入的结尾或水平空格。
    • \E(?!\S) - \E 停止引用,(?!\S) 要求右侧紧接空格或字符串结尾。

    【讨论】:

    • PCRE 表达式:grep -P '(^|\s)\Q'"$var"'\E(\s|$)' -- 或许更具可读性。由于 \Q...\E,这也将 var 匹配为普通测试,而不是正则表达式
    • @glennjackman 在以下情况下很好 1) 如果 OP 有 GNU grep 和 2) 如果 var 可以有除数字以外的值。
    • 感谢我给出的例子,但你能告诉我为什么它不适用于 var="hi.*by" (regex) 吗?
    • @jenny hi.*by 是一个正则表达式模式,对吧?您的行不以by 结尾,它们以bye 结尾,请参阅ideone.com/MjNQNxvar='hi.*bye'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    相关资源
    最近更新 更多