正则表达式/使用字典中的预定义值替换文本文件中的相同字符串

时间:2013-03-19 11:08:34

标签: regex text replace

我有一个巨大的文本文件,其内容与此类似:

<!-- $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有关吗?我是初学者,所以请保持温柔:)

亲切的问候 奥利弗

3 个答案:

答案 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

然后,您可以针对您的文件运行此脚本。