我有一个用户输入,可以在包含元字符的搜索字符串中使用
例如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'`
但它不能正常工作。 或者有没有其他方法来处理用元字符的用户输入?
提前致谢
答案 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列表以适应。处理|有点棘手,因为反斜杠使变得特别,但由于我们已经反斜杠反斜杠,我认为它是安全的。