我有一个巨大的文本文件,其内容与此类似:
<!-- $var = aaa -->
<!-- $var = aaa -->
<!-- $var = aaa -->
<!-- $var = aaa -->
<!-- $var = aaa -->
.
<!-- $var = bbb -->
<!-- $var = bbb -->
<!-- $var = bbb -->
<!-- $var = bbb -->
<!-- $var = bbb -->
我希望实现$var
将被替换为:
<!-- $address = aaa -->
<!-- $city = aaa -->
<!-- $zip = aaa -->
<!-- $phone = aaa -->
<!-- $geo = aaa -->
.
.
<!-- $address = bbb -->
<!-- $city = bbb -->
<!-- $zip = bbb -->
<!-- $phone = bbb -->
<!-- $geo = bbb -->
序列始终相同。 我研究了大约3个小时,但我无法超越这个大脑障碍。 我的想法是用正则表达式实现这一点,但似乎我需要一个脚本来解决这个问题。
你能给我一个方向的提示,这可能与Regex有关吗?我是初学者,所以请保持温柔:)
亲切的问候 奥利弗
答案 0 :(得分:1)
你需要一次处理一行,根据它所在的行应用不同的正则表达式,如(我不知道你需要哪种语言,因此将其视为伪代码,如果需要可以进行优化)< / p>
var replacements = new[]{"address","city","zip","phone","geo"};
var replacement = replacements[row % 5];
var r = new Regex("(^<!-- \$)var(.*$)";
var newline = r.Replace(oldline, "$1"+replacement+"$2");
答案 1 :(得分:1)
这应该这样做。我用Progammer的记事本测试了这个。如果你使用不同的东西,你可能需要调整它。
Find:
(<!-- \$var = (\w+) -->\r\n){5}
Replace:
<!-- $address = \2 -->\r\n<!-- $city = \2 -->\r\n<!-- $zip = \2 -->\r\n<!-- $phone = \2 -->\r\n<!-- $geo = \2 -->\r\n
理解这一点的关键是\2
。这引用了正则表达式找到的第二组。一个群体被困在父母()
中。
\0
将匹配整个字符串
\1
将匹配第一组支持。 (<!-- \$var = (\w+) -->\r\n)
\2
将匹配第二组支持。 (\w+)
这是你的aaa或bbb
答案 2 :(得分:1)
你可以写一个正则表达式来实现这一点,但是使用像sed
这样的东西会更容易,它会单独定位线。
#!/bin/sh
sed '
s/\$var/\$address/ # replace $var with $address
N # next line
s/\$var/\$city / # replace $var with $city
N # next line
s/\$var/\$zip / # replace $var with $zip
N # next line
s/\$var/\$phone / # replace $var with $phone
N # next line
s/\$var/\$geo / # replace $var with $geo
' $1
然后,您可以针对您的文件运行此脚本。