ack或grep正则表达式匹配两条线,几乎相同

时间:2010-10-05 12:56:04

标签: regex grep

我正在查看代码,看起来非常像:

#$foo="bar";
$foo="baz";

问题:

  1. 我不知道变量的名称
  2. 我不知道哪条线实际被注释掉了。
  3. 我似乎无法正确编写多行正则表达式。
  4. 我最初的尝试是确认/\$(.\*)=.\*$\$($1)=/

    我更喜欢ack通常用于代码grepping,但我也不介意使用grep。 JWZ可能认为我现在已经解决了两个以上的问题。

4 个答案:

答案 0 :(得分:7)

grep和ack都不会一次处理多行。

答案 1 :(得分:0)

我并不完全理解你的匹配规则,但这个正则表达式应该显示方向:

^#\$(\w+)=.*?\$(\1)=

// [x] ^$ match at line breaks
// [x] Dot matches all

通常grep不支持多行匹配。

答案 2 :(得分:0)

这可能有效:

^#?(\$\w+)\s*=.*[\r\n]+#?\1\s*=.*$

说明:

^            start of line
#?           optional comment
(\$\w+)      $, followed by variable name, captured into backreference no. 1
\s*          optional whitespace
=            =
.*           any characters except newline
[\r\n]+      one or more newlines (\r thrown in for safety)
#?           optional comment
\1           same variable name as in the last line
\s*=.*       as above
$            end of line

这并不会检查其中一行是否被注释掉(如果没有或两者都匹配,它也会匹配)。如果这是一个问题,请告诉我。

我不知道grep是否可以匹配单个正则表达式中的多行;您正在使用的任何工具都应设置为“^/$匹配开始/结束行”模式(而不是字符串的开头/结尾)。

答案 3 :(得分:0)

您可以在grep中使用-A或-B列出要查找的字符串上方或之后的行

$cat 1.txt
a
b
c
d
123
e
f
g
h
─$ grep 123 1.txt -A 3 -B 2
c
d
123
e
f
g