我正在寻找引号内的字符串,其中单词 Linux 出现在括号之间的某个位置,而括号位于引号内的某个位置。我必须使用正则表达式来执行此操作。我需要在 Linux 操作系统中执行此操作(使用 Virtual Box Terminal)。我使用了以下正则表达式:
egrep "\"([^"]*)?\(([^"]*)?Linux([^"]*)?\)([^"]*)?\"" [FILE]
但问题是,我明白了
bash: syntax error near unexpected token '("
每次都是这样。问题可能出在哪里?我尝试了这个正则表达式http://regexr.com/“它工作正常,正则表达式没有任何问题。但 Linux shell 总是产生同样的问题……我在括号前使用了“\”,因为它们是元字符。我在双引号前也做了同样的事情……但它不起作用。有人能帮帮我吗?
答案1
问题在于表达式中的未转义双引号,例如围绕此部分"]*)?\(([^]"
。如果你想传递文字"
,包括双引号或()
或内[]
,那么你必须引用引号!你可以这样做
egrep "\"([^\"]*)?\(([^\"]*)?Linux([^\"]*)?\)([^\"]*)?\"" FILE
但一个不那么丑陋的方法是引用整个表达式单引号egrep
,并且通常始终用强(单)引号引用你的正则表达式,以便 shell 在将其作为参数传递给你正在使用的任何程序之前不会对它做任何奇怪的事情:
egrep '"([^"]*)?\(([^"]*)?Linux([^"]*)?\)([^"]*)?"' FILE
(现在您也不需要转义外面的双引号,但是您需要其他反斜杠来使括号成为文字(在 ERE 中))
如果你不想要该行的其余部分,请添加-o
(match only)
egrep -o '"([^"]*)?\(([^"]*)?Linux([^"]*)?\)([^"]*)?"' FILE
你没有给出一个例子,所以我举了一个愚蠢的例子......这是之前的例子:
what
where is "the (lost Linux that I want) to find somewhere" in this file
and some junk
we don't want this thing "here where Linux is (not in brackets)"
之后:
"the (lost Linux that I want) to find somewhere"
(注意:使用 GNUgrep
你可以grep -E
不用使用egrep
)
答案2
将第一个和最后一个双引号替换"
为单引号'
。
egrep '\"([^"]*)?\(([^"]*)?Linux([^"]*)?\)([^"]*)?\"' [FILE]