BASH:如何将变量置于正则表达式中?

时间:2011-04-19 07:57:08

标签: regex bash variables grep

我正在尝试使用以下代码:

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 个答案:

答案 0 :(得分:2)

Just Bash

searchfile="file"
read searchterm
shopt -s nocasematch
while read -r line
do
    case "$line" in
        *"$searchterm"*";"* ) echo "$line";;
    esac
done < "$searchfile"

答案 1 :(得分:1)

您需要在此控制分词。这是通过数组完成的。见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

答案 2 :(得分:0)

您正在寻找的代码如下:

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

请注意,我简化了你的正则表达式(我希望我做对了!)。

然而,正如Ignacio Vazquez-Abrar指出的那样,在复杂的情况下,这将失败。

答案 3 :(得分:0)

由于这是s正则表达式,请尝试将“”替换为\s。这代表一个空白字符。

“黑\赛义德\ speas”

答案 4 :(得分:0)

替代方法是通过xargs传递参数:

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

答案 5 :(得分:0)

我通过在正则表达式中搜索“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'哦!