0

我有一个用户输入,可用于可能包含元字符的搜索字符串

例如 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'`

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

提前致谢

4

3 回答 3

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#
于 2010-01-25T21:49:44.600 回答
0

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

像这样的东西:

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

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

于 2010-01-26T05:20:07.077 回答
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 中获得输入

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"
于 2010-01-26T00:16:32.550 回答