【问题标题】:grep regex not returning result when regex stored in shellscript variable当正则表达式存储在 shell 脚本变量中时,grep 正则表达式不返回结果
【发布时间】:2017-07-25 10:18:46
【问题描述】:

假设我的 Helloworld.txt 包含

function( '100');

现在我想在( 之后搜索'100' 的任何出现,它们之间可能有空格。现在,使用这个 UNIX 命令:

案例一:

grep "[(][ ]*'100'" Helloworld.txt

我在 Helloworld.txt 中找到正确的匹配项。

但是当我写一个简单的shellscript时:

案例二:

Key="100"
Key="\"[(][ ]*'$Key'\"" 
echo $Key
grep $Key Helloworld.txt

正确打印:"[(][ ]*'100'"

但是,它不会返回在 Helloworld.txt 中找到的匹配项

【问题讨论】:

  • 为什么要添加\"?使用Key="[(][ ]*'$Key'"
  • @WiktorStribiżew:我用双引号括起来,因为当我独立 grepping 时,如 Case-I 所示,我周围有双引号。我刚刚测试过,删除\" 也没有帮助。未找到匹配项。

标签: regex bash shell unix grep


【解决方案1】:

我认为你有点过于复杂了。你原来的命令可以这样写:

grep "( *'100'" Helloworld.txt

如果您希望数字 100 来自变量,请使用:

grep "( *'$key'" Helloworld.txt

如果你想将整个正则表达式存储在一个变量中,那就是:

regex="( *'$key'"
grep "$regex" Helloworld.txt

请注意,语法引号(如字符串文字或变量周围的引号)不能与字符串中的引号互换。我的意思是以下两件事不等价

regex="( *'$key'" # good
grep "$regex"

regex="\"( *'$key'\"" # bad
grep $regex

以下是显示所有选项的测试:

$ cat file
function( '100');
$ grep "( *'100'" file
function( '100');
$ key=100
$ grep "( *'$key'" file
function( '100');
$ regex="( *'$key'"
$ grep "$regex" file
function( '100');

【讨论】:

  • 我已经编辑了我的答案以显示每个选项都有效。
猜你喜欢
  • 2013-08-11
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多