0

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

<!-- $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 个小时,但我无法通过这个大脑障碍。我的想法是用正则表达式来实现这一点,但似乎我需要一个脚本来解决这个问题。

你能给我一个提示,往哪个方向走吗?这对正则表达式有可能吗?我是初学者,所以请温柔:)

亲切的问候奥利弗

4

3 回答 3

1

您需要一次处理一行,根据它是哪一行应用不同的正则表达式,如(我不知道您需要哪种语言,所以将其视为伪代码,如果需要可以对其进行优化)

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");
于 2013-03-19T11:19:31.110 回答
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

于 2013-03-19T11:25:11.683 回答
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

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

于 2013-03-19T11:37:17.370 回答