BASH: как поместить переменную в регулярное выражение? - PullRequest
6 голосов
/ 19 апреля 2011

я пытаюсь заставить работать следующий код:

searchfile="availables.txt"
read searchterm
grep_params="-i ^.*${searchterm}.*;.*$' $searchfile"
egrep $grep_params

, который должен отображать все строки, начинающиеся с $ searchterm и сопровождаемые ";". Но если searchterm содержит пробелы, которые он не работает (например: «горох с черными глазами»), он дает мне следующий вывод:

egrep: eyed: No such file or directory
egrep: peas.*;.*$": No such file or directory
egrep: "availables.txt": No such file or directory

Ответы [ 6 ]

2 голосов
/ 21 апреля 2011

Just Bash

searchfile="file"
read searchterm
shopt -s nocasematch
while read -r line
do
    case "$line" in
        *"$searchterm"*";"* ) echo "$line";;
    esac
done < "$searchfile"
1 голос
/ 19 апреля 2011

Вы должны контролировать разделение слов здесь.Это делается с помощью массивов.См. http://mywiki.wooledge.org/WordSplitting

searchfile="availables.txt"
read searchterm
grep_params=(-i "^.*${searchterm}.*;.*$" $searchfile)
egrep "${grep_params[@]}"

Но не используйте egrep - вместо этого используйте grep -E, так как первое устарело.Но я бы изменил ваш код так:

searchfile="availables.txt"
read searchterm
grep_params="^.*${searchterm}.*;.*$"
grep -E -i "$grep_params" $searchfile
0 голосов
/ 28 сентября 2011

Я попал сюда в поиске «переменная bash в регулярном выражении»

Я решил это, изменив разделители регулярных выражений с «/» на «+»

Даже если он не имеет ничегоделать с egrep, я добавляю свое решение для других людей, которые приходят из похожих поисков:

SYBASELOG="/opt/sybase/ASE-12_5/install/SYBASE.log"
MAILBODY="Some text and then the replacement placeholder:

   [MSGFILE]

   and some more text"

# Some proecessing...

MAILBODY=`echo "${MAILBODY}" | sed -e "s+\[MSGFILE\]+"${SYBASELOG}"+"`

И да, теперь я вижу, что это имеет мало общего с bash и со всеми косыми чертами впеременная файла журнала.D'ой!

0 голосов
/ 19 апреля 2011

Альтернативный способ - передать параметры через xargs:

searchfile="availables.txt"
read searchterm
grep_params="-i '^.*${searchterm}.*;.*$' $searchfile"
echo "$grep_params" | xargs egrep
0 голосов
/ 19 апреля 2011

Поскольку это регулярное выражение, попробуйте заменить "" на \s. Это символ пробела.

"черный \ Сейед \ Speas"

0 голосов
/ 19 апреля 2011

Код, который вы ищете, выглядит примерно так:

searchfile="availables.txt"
read searchterm
regex="${searchterm}"'.*;'
egrep "${grep_params}" "${searchfile}"

Обратите внимание, что я упростил ваше регулярное выражение (надеюсь, я правильно понял!).

Однако, как Игнасио Васкес-Абрар отметил, что это не удастся в сложных случаях.

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