【发布时间】:2010-01-25 20:55:25
【问题描述】:
我有一个用户输入将用于可能包含元字符的搜索字符串
例如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'`
但它不能正常工作。 或者有没有其他方法可以使用元字符来处理用户输入?
提前致谢
【问题讨论】:
-
您是如何获得用户输入的?作为命令行参数还是通过
read命令? -
有趣。使用您的新示例,C++ 是给我带来麻烦的一个,它似乎是 C# 对您来说有问题。我发现使用 both 引号和反斜杠会有所帮助:
grep -E "C\+\+"就像使用带有转义管道的常规 grep 而不逃避加号一样:grep "C++\|C#" -
关于您的 sed 示例,您通常不希望在赋值左侧的变量名称上使用美元符号(除非您正在执行间接操作)。
-
这两个变量需要在同一行中才能被找到,并且按照顺序 $1 先然后 $2 有人指出 awk 可能会起作用,我想我去读一下。希望这是正确的方法,顺便说一句,谢谢你帮助我:)
标签: bash variables grep user-input special-characters