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

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

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

[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

おすすめ記事