【问题标题】:Need help matching a mattern using grep/egrep in bash scripting需要帮助在 bash 脚本中使用 grep/egrep 匹配事物
【发布时间】:2019-04-22 00:45:05
【问题描述】:

我正在尝试匹配给定字符串的所有字符,但这些字符应该按照给定 bash 脚本的顺序匹配。

while [[ $# -gt 0 ]]; do
  case $1 in
       -i)
    arg=$2
    egrep "*[$arg]*" words.txt 
    shift ;;
  esac
  shift
done

$ sh match_the_pattern.sh -i aei words.txt

应该返回类似的词

abstentious
adventitious
sacrilegiousness

如果您注意到,首先匹配a,然后匹配e,然后是i,所有这些都是按顺序排列的。另外,整个单词都经过匹配和过滤。

【问题讨论】:

    标签: bash shell grep


    【解决方案1】:

    您可以使用 getopts 和一些 bash 参数替换来构造查询字符串。

    #!/bin/bash
    while getopts 'i:' choice
    do
      case "${choice}" in
        i)
         length=${#OPTARG}
         for((count=0;count<length;count++))
         do
          if [ $count -eq 0 ]
          then 
           pattern="${pattern}.*${OPTARG:count:1}.*"
          else
           pattern="${pattern}${OPTARG:count:1}.*"
          fi
         done
        ;;    
      esac
    done
    # The remaining parameter should be our filename
    shift $(($OPTIND - 1))
    filename="$1"
    # Some error checking based on the parsed values
    # Ideally user input should not be trusted, so a security check should
    # also be done,omitting that for brevity.
    if [ -z "$pattern" ] || [ -z "$filename" ]
    then
     echo "-i is must. Also, filename cannot be empty"
     echo "Run the script like ./scriptname -i 'value' -- filename"
    else
     grep -i "${pattern}" "$filename"
    fi
    

    参考this 了解更多关于parameter substitutionthisgetopts

    【讨论】:

      【解决方案2】:

      改变这个:

      arg=$2
      egrep "*[$arg]*" words.txt
      

      到这里:

      arg=$(sed 's/./.*[&]/g' <<< "$2")
      grep "$arg" words.txt
      

      如果这不是您需要的全部,请编辑您的问题以阐明您的要求并提供更具代表性的示例输入/输出。

      【讨论】:

      • 如果命令是sh script.sh -i aei words.txt,你可能会做grep "$arg" "$3"
      • 是的,还有其他几个改进 OP 脚本的“机会”:-)。
      • 您的解决方案非常好,尽管在 grep 中放置静态“words.txt”似乎是多余的,因为他似乎已经将其作为参数包含在他的命令中,这就是我所指出的。干杯!
      • 我完全理解,但我只是向 OP 展示了如何做她特别询问的事情,并将脚本中的更改保持在最低限度,因此她需要为该特定问题做些什么就像可能而不是用其他不相关的变化来混淆它。我评论中的重点是她的脚本中还有其他一些可以改进的地方,包括硬编码的文件名。
      • 是的,可以理解;我真的不是那些希望有人回答问题来重写整个脚本的人之一,无论哪种方式,这都是一个很好的简单解决方案(之前已赞成)。
      【解决方案3】:

      您的正则表达式匹配“a”或“e”或“i”,因为它们在字符集中 ([])。 我认为您正在寻找的正则表达式是

      a+.*e+.*i+.*
      

      匹配 'a' 一次或多次,然后匹配任何东西,然后匹配 'e' 一次或多次,然后匹配任何东西,然后匹配 'i' 一次或多次。

      【讨论】:

      • 显然操作需要构造这样一个模式,因为-i参数的参数构成了问题的核心。
      猜你喜欢
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 2014-07-02
      • 2016-11-17
      • 1970-01-01
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多