代码之家  ›  专栏  ›  技术社区  ›  Shailesh Sutar

grep substring是一个带有前缀点的变量

  •  -1
  • Shailesh Sutar  · 技术社区  · 6 年前

    我有一个数组,其值为 namespace=(example examples-ixx) 我需要使用for循环遍历这个数组 example 变量ns中的字符串。下面是我将要调查的文件内容。

    http://example-service-v2.example-ixx:8080/actuator/info
    http://example-service-v2.example:8080/actuator/info
    

    我试过以下几种组合,但都不管用 grep -w ".$ns" filename grep -w "\.$ns" filename fgrep -w ".$ns" filename fgrep -w "\.$ns" filename

    我想要grep当前分配给变量$ns的确切字符串。不多不少。有人能帮我做这个吗。

    3 回复  |  直到 6 年前
        1
  •  0
  •   ghoti    6 年前

    根据您的问题,我们设置一个数组:

    declare -a namespace=(
      example
      example-ixx
    )
    

    然后你可以单步执行你的数组,运行 grep 对于每个元素。例如:

    for ns in "${namespace[@]}"; do
      printf '%s> %s\n' "$ns" "$(grep "\.$ns:" input.txt)"
    done
    

    请注意,这并不能防止URL列表中可能出现多个条目。当然,我不知道这是否重要。

    或者,可以从数组内容构造正则表达式:

    grep -E "\.($(IFS="|$IFS"; printf '%s\n' "${namespace[*]}")):" input.txt
    

    这将导致一个输出流,而不是每个数组元素处理一行,并且可能由于在源数组中包含正则表达式特殊字符而变得复杂。

    注意,对于这两种解决方案,我们将搜索的内容包装在 . : ,根据问题中的示例输入。

        2
  •  0
  •   user1934428    6 年前

    你的 -w 毁了你的一天。在手册页中,描述-w选项:

    只选择那些包含构成整个单词的匹配项的行。测试是,匹配的子字符串必须位于行的开头,或者前面有一个非单词组成字符。

    如果你有绳子 v2.示例: ,点前面的字符是 2个 ,这是一个单词字符,因此不匹配。你当然可以写

    grep -F ".$ns" ....
    

    但这也会抓住 .示例ABC .

    只要你的变量 ns 不包含在正则表达式中具有特殊含义的字符,可以使用

    grep -E "[.]$ns\\>" ....
    

    因为 \> 匹配单词边界。但是,如果 北美洲 不包含这样的字符,这将不起作用。你可以通过

    grep -E "[.]\\Q$ns\\E\\>" ....
    

    因为两者之间 \Q \E 从字面上理解,但这个解决方案也不是完美的:如果 北美洲 本身包含这些特殊的逃逸,你会得到有趣的结果。

    从技术上讲,需要转义内部的所有regex字符 北美洲 但是,仅仅使用POSIX shell的工具来完成这项任务,我甚至不会强迫我的敌人去做。如果您真的需要一个在一般情况下可以工作的解决方案,那么用一个用Perl或Ruby之类的语言编写的小脚本来进行重映射可能会更容易,在这种语言中,您有用于转义regexp的内置函数。

        3
  •  0
  •   Shailesh Sutar    6 年前

    我可以用下面的grep命令解决这个问题。

    grep -P "((?<=^)|(?<=\s))$var(?=(\s|$))"