パターンと一致し、その後に続く最初の文字列インスタンスを置き換えます。

パターンと一致し、その後に続く最初の文字列インスタンスを置き換えます。

次のように構成ファイルを変更するためのスクリプトを作成しています。

[purple]
auth = no
enabled = 0
username = 
password =
priority = 0
host = True

[shovel]
group = 
manual = False
enabled = 0
username = 

これには多くの[カテゴリ]があり、時にはキー/値ペアと同じキーが含まれます。

"enabled = 0"の値を "enabled = 1"に変更するawk/sed/grep/tr/cut/perlを使用して1行のコードを作成できますか?ただし、カテゴリ[shovel]に対してのみ可能ですか?

答え1

範囲を使用sedできます(カテゴリの末尾の空白行で停止[shovel])。

sed '/\[shovel\]/,/^$/ s/enabled = 0/enabled = 1/' file

最初の部分は、/\[shovel\]/,/^$/を使用して行を検索し[shovel]、空の行が見つかるまで続行し、そのs/old/new部分(この場合は単純な部分)でのみ次のコマンドを実行することを意味します。file

コメントへの応答注:sed範囲とアドレスの代替区切り文字は、前にバックスラッシュがない限り許可されません(したがって、/一致する必要がある場合はリテラルである必要があるすべての文字をエスケープしてください)。次のコマンドでは、いつでも代替区切り文字を使用できます。たとえば、次のようになります。

sed '/\[shovel\]/,/^$/ s|enabled = 0|enabled = 1|' file

または

sed '\|\[shovel\]|, |^$| s|enabled = 0|enabled = 1|' file

答え2

設定が次のと仮定し、Perlを使用するソリューションは次のとおりですconfig.ini

perl -000 -n -i -e 's/^enabled = 0$/enabled = 1/m if /^\[shovel\]\n/; print;' config.ini

これは次のことを行います。

  • -000$/ = "\n\n";- 基本的にコードと同じように短絡モードでファイルを読み込みます。
  • -n- ループ内で指定されたコードを実行しますwhile (<>) { }
  • -i- 標準出力として印刷する代わりに、指定したファイルをインラインで編集します。オプションで拡張子を指定できます。これにより、入力ファイルがその拡張子にバックアップされます。たとえば、-i.bakconfig.ini.bak
  • -e- 指定されたPerlコードを実行します。

コード自体は、入力「段落」自体が1行から始まる場合、代替項目にenabled = 0まったく同じ行が含まれると言います。正規表現で特別な意味を持つことが多いので、エスケープする必要があります。enabled = 1[shovel][]

答え3

このawkソリューションを試すことはできますか?

awk '/shovel/{flag=1}flag&&/enabled/{$NF=1;flag=0}1' input

答え4

sed特定の行に対する変更を制限できます。

 sed -i '3s/enabled = 0/enabled = 1/g' file

これにより、ライン3 [紫]のみが修正されます。

関連情報