次のファイル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
ファイルを逆にすると、次のようにできます。最初何かを見るとき:
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