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

これを一挙に行う正規表現を書くこともでき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 に答える
1

次のように、一度に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. これは、正規表現によって見つかった 2 番目のグループを参照します。グループは括弧で囲まれたものです()

\0文字列全体に一致します。
\1バケットの最初のセットと一致します。(<!-- \$var = (\w+) -->\r\n)
\2バケットの 2 番目のセットと一致します。(\w+) これはあなたの aaa または bbb です

于 2013-03-19T11:25:11.683 に答える