次のように構成ファイルを変更するためのスクリプトを作成しています。
[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.bak
。config.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 [紫]のみが修正されます。