处理搜索字符串中的元字符

时间:2010-01-25 20:55:26

标签: bash variables grep user-input special-characters

我有一个用户输入,可以在包含元字符的搜索字符串中使用

例如C#或C ++

我在函数中的grep命令是:

grep -E "$1|$2" test.txt

直接替换:

grep -E "C\+\+|testWord" test.txt
grep -E "C\#|testWord" test.txt

第一个抓住线路很好但不是第二个。 奇怪的是,#完全被忽略了。 没有直接替换,两者都用c跟随testWord而不是c ++和c#分别捕获

我尝试使用sed

处理它
$temp = `echo $1 | sed 's/[\#\!\&\;\`\"\'\|\*\?\~\<\>\^\(\)\[\]\{\}\$\+\\]/\\&/g'`

但它不能正常工作。 或者有没有其他方法来处理用元字符的用户输入?

提前致谢

3 个答案:

答案 0 :(得分:0)

这对我有用:

$ testfun1(){ echo "foo $1" | grep "$1"; }
$ testfun1 C#
foo C#
$ testfun2(){ read a; echo "bar $a" | grep "$a"; }
$ testfun2
C#
bar C#

修改

您可以在没有-E的情况下尝试此表单:

$ testfun3(){ grep "$1\|$2" test.txt; }
$ testfun3 C++ awk
something about C++
blah awk blah
$ testfun3 C# sed
blah sed blah
the text containing C#
$ testfun3 C# C++
something about C++
the text containing C#

答案 1 :(得分:0)

如果您将输入作为参数传递给脚本

#!/bin/bash

input1="$1"
input2="$2"
while read -r line
do
    case "$line" in
        *$input1*|*$input2* ) echo "found: $line";;
    esac
done  <"BooksDB.txt

输出

$ cat file
this is  a line
this line has C++ and C#
this line has only C++ and that's it
this line has only C# and that's it
this is end line Caa

$ ./shell.sh C++ C#
found: this line has C++ and C#
found: this line has only C++ and that's it
found: this line has only C# and that's it

如果你从阅读

获得输入
read -p "Enter input1:" input1
read -p "Enter input2:" input2
while read -r line
do
    case "$line" in
        *$input1|*$input2* ) echo "found: $line";;
    esac
done <"BooksDB.txt"

答案 2 :(得分:0)

在将它们添加到grep表达式之前,只需引用$ 1和$ 2中的所有grep元字符。

这样的事情:

quoted1=`echo "$1" | sed -e 's/\([]\.?^${}+*[]\)/\\\\\1/g'`
quoted2=`echo "$2" | sed -e 's/\([]\.?^${}+*[]\)/\\\\\1/g'`
grep -E "$quoted1\|$quoted2" test.txt

应该工作。调整metachar列表以适应。处理|有点棘手,因为反斜杠使变得特别,但由于我们已经反斜杠反斜杠,我认为它是安全的。