1つのディレクトリにあまりにも多くのファイル(約100ファイル)がありますsite.ini.append.php
。
それらはすべて次のとおりです。
[block1]
blabla[]
blabla[]=blabla
...
blabla[]=blabla
[block2]
blabla[]
blabla[]=blabla
...
blabla[]=blabla
[block3]
blabla[]
blabla[]=blabla
...
blabla[]=blabla
ただし、[block1]
アイテムの数はファイルによって異なります。他のブロックも同じだ。
最後に新しい行を追加する必要があります[block2]
。
[block2]
blabla[]
blabla[]=blabla
...
blabla[]=blabla
blabla[]=new_entry
[block2]
私が言ったように、ブロックには異なる項目があり、あるファイルには20行があり、別のファイルには10行がある可能性があるため、行番号のみを使用することはできません。
私はこのようなことを考えていました。
sed -n '/^\[block2\]$/,/^$/ a blabla[]=new_entry' path/to/one_of_the_site.ini.append.php
/^\[block2\]$/,/^$/
しかし、明らかにアドレスではないので動作しません。
どうすればいいですか(可能であればsedを使用)?
修正する
説明どおりここ、/^[ブロック 2]$/,/^$/有効なアドレスです。
しかし、両方ㅏ、私私のために問題を解決しました。
sed -n '/^\[block2\]$/,/^$/ a blabla[]=new_entry' path/to/one_of_the_site.ini.append.php
sed -n '/^\[block2\]$/,/^$/ i blabla[]=new_entry' path/to/one_of_the_site.ini.append.php
環境
$ sed --version
GNU sed version 4.1.5
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.
答え1
@don_crisstiの提案によると、これは私のMacのGNU sedとBSDで動作するようです。
sed -e $'/^\\\[block2\\\]$/,/^$/ {/^$/i\\\nnew line\n}' < input
ただし、これは空の行があるかどうかによって異なりますが、探しているブロックが最後のブロックである場合、ファイルにそのブロックがあるかどうかはわかりません。
コマンドを開始および終了するために実際の改行文字を取得するにはsedが必要なので、i
ANSI-C引用符を使用して$''
1つを作成しました(ksh / zsh / bashでサポートされています)。標準シェルでは手動で挿入する必要があります。
答え2
sed '/block2/,/^$/s/^$/blabla[]=new_entry\n/g' filename
上記のオネライナーはうまくいきます。 block2と改行文字の間の行を一致させ、改行文字をblabla [] = new_entry \ nに置き換えます。気になる点があれば教えてください。
出力
[block1]
blabla[]
blabla[]=blabla
...
blabla[]=blabla
[block2]
blabla[]
blabla[]=blabla
...
blabla[]=blabla
blabla[]=new_entry
[block3]
blabla[]
blabla[]=blabla
...
blabla[]=blabla