我正在查看代码,看起来非常像:
#$foo="bar";
$foo="baz";
问题:
我最初的尝试是确认/\$(.\*)=.\*$\$($1)=/
我更喜欢ack通常用于代码grepping,但我也不介意使用grep。 JWZ可能认为我现在已经解决了两个以上的问题。
答案 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