編集する

編集する

次のファイルlists.txtがあります。

// stuff at beginning of file

var list1 = new Array();
i = 0;
list1[i++] = 'a';
list1[i++] = 'b';
...
list1[i++] = 'z';

var list2 = new Array();
i = 0;
list2[i++] = 'a';
list2[i++] = 'b';
...
list2[i++] = 'z';

// other stuff at end of file

各リスト(3つ以上があります)に追加し、次のように終了する必要があります。

var list1 = new Array();
i = 0;
list1[i++] = 'a';
list1[i++] = 'b';
...
list1[i++] = 'z';
list1[i++] = 'something new';

var list2 = new Array();
i = 0;
list2[i++] = 'a';
list2[i++] = 'b';
...
list2[i++] = 'z';
list2[i++] = 'another thing';

// other stuff at end of file

私はこれについてしばらく心配してきました。各リストの最後の項目を取得する方法を知っています。

list1_last=$(grep "list1\[i++\]" lists.txt | tail -1)
list2_last=$(grep "list2\[i++\]" lists.txt | tail -1)

最初のリストの先頭と2番目のリストの先頭(含む)の間のすべてのアイテムを取得する方法を知っています。

list1=$(sed -n '/var list1/,/var list2/p' lists.txt)

私はlist2の最初の行なしでlist1を取得できることを知っています。このPerlコード行またはこのクレイジーsedスクリプト

しかし、すべての作品を1つに集めるのに苦労しています。どうすればいいですか?

編集する

追加する追加値は、別のファイル extra-values.txt にあります。たとえば、次のようになります。

list1[i++] = 'something new';
list2[i++] = 'another thing';

両方のファイルをマージしようとしていると言えるようです。

編集2

実際の文書次のように見えます。

// comment
// comment
// ...
var foo = "bar";

// comment
// comment
// ...
var i= 0;

// comment
// comment
// ...
var GoodDomains = new Array();
i=0;
GoodDomains[i++] = "anything.com";  // comment
GoodDomains[i++] = "something.com"; // comment
...
GoodDomains[i++] = "lastthing.com"; // comment
// THIS IS WHERE I WANT TO INSERT SOMETHING

// comment
// comment
// ...
var BadDomains = new Array();
i=0;
BadDomains[i++] = "anything.com";  // comment
BadDomains[i++] = "something.com"; // comment
...
BadDomains[i++] = "lastthing.com"; // comment
// THIS IS WHERE I WANT TO INSERT SOMETHING

// more lists, including GoodHosts, GoodURLs, etc.

// comment
// comment
// ...
for (i in GoodDomains) {
    ...
}

// loop through BadDomains, GoodHosts, GoodURLs, etc.

// comment
// comment
// ...
function IsNumIpAddr(host) {
    ...
}

もともとは単純化されたバージョンを公開しました。

  1. 実際のファイルが常にこの形式に従うかどうかはわかりません(上部のコメント、変数宣言、追加コメント、リスト定義、関数など)。
  2. 問題に対する一般的な解決策を見つけたいです(ファイルの中央にあるリストにコンテンツを追加します)。

誤解を招くと申し訳ありません。

ベストアンサー1

ファイルを逆にすると、次のようにできます。最初何かを見るとき:

tac lists.txt |
awk -v l1="list1" -v val1="something new" \
    -v l2="list2" -v val2="another thing" '
          index($0, l1"[i++]") && !found1 {
              printf "%s[i++] = \"%s\";\n", l1, val1
              found1 = 1
          }
          index($0, l2"[i++]") && !found2 { 
              printf "%s[i++] = \"%s\";\n", l2, val2
              found2 = 1
          }
          {print}
' |
tac > lists.txt.new

少し退屈しても大丈夫です。

「additional-values.txt」を見逃しました。これは良いです:

tac lists.txt | 
awk '
    NR == FNR {additional[$1] = $0; next}
    $1 in additional && !found[$1] {print additional[$1]; found[$1] = 1}
    {print}
' additional-values.txt - | 
tac > newfile

おすすめ記事