Нужна помощь в поиске соответствия с использованием grep / egrep в скриптах bash - PullRequest
2 голосов
/ 22 апреля 2019

Я пытаюсь сопоставить все символы данной строки, но эти символы должны совпадать в порядке, указанном в сценарии 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, все они в порядке.Кроме того, все слово сопоставляется и фильтруется.

Ответы [ 3 ]

3 голосов
/ 22 апреля 2019

Вы можете использовать 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

См. это , чтобы узнать больше о parameter substitution и это для getopts.

2 голосов
/ 22 апреля 2019

Изменить это:

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

к этому:

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

Если это не все, что вам нужно, отредактируйте ваш вопрос, чтобы уточнить ваши требования и предоставить более по-настоящему репрезентативный пример ввода / вывода.

1 голос
/ 22 апреля 2019

Ваше регулярное выражение соответствует 'a' или 'e' или 'i', потому что они находятся в наборе символов ([]).Я думаю, что регулярное выражение, которое вы ищете, это

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

, которое соответствует 'a' один или несколько раз, затем что-нибудь, затем 'e' один или несколько раз, затем что-нибудь, затем 'i' один илибольше раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...