次の構成ファイルがたくさんあります。
reader_0 = newcamd({
name = "Oct 1",
host = "hostname 1",
port = 27020,
user = "UNAME",
pass = "password1",
key = "0102030405060708091011121314",
})
reader_1 = newcamd({
name = "Oct 2",
host = "hostname 2",
port = 27020,
user = "UNAME",
pass = "password2",
key = "0102030405060708091011121314",
})
ポート番号27020を「reader_1」セクションの他のポート番号(22443など)に置き換える方法sed?
ありがとうございます。
答え1
sedの全身であるedを使用してください。
ed -s input <<< $'/^reader_1 =\n/^port =\nc\nport = 22443,\n.\nw\nq'
ed
これにより、ファイルを編集するためにANSI引用符付きコマンド文字列が送信されます。コマンドは次のとおりです。
/^reader_1 =
- "reader_1 ="で始まる行を検索する/^port =
- そこから「port =」で始まる行を前方に検索します。c
- この行を変更してくださいport = 22443,
- 本文に移動.
- 代替テキストの終わりw
--ディスクにファイルを書き込むq
- 辞職するed
実際のデータに基づいて、ある程度慎重に一致するように正規表現を強化または緩めることができます。
答え2
私は、、などがあるとreader_0
仮定します。host = hostanme 1
reader_1
host = hostname 2
このコマンドを使用して、以下を置き換えることができますfile
。
sed -i '/host = "hostname 2",/{N;s/port = 27020,/port = 22443,/}' file
答え3
同じファイルに同じ行が複数ある場合は、次のように入力する必要があります。
sed -i ':a;N;$!ba; s/27020/22443/2' file
どこ/22回目のゲームに代わるという意味です。27020。 -i パラメーターなしで sed を使用してこのコマンドをテストして、どのような結果が出るかを確認できます。
sed -i 's/27020/22443/g' file
それ以外の場合は、変更するファイルを知っている限り、簡単なアプローチが機能します。
答え4
awk
ステートマシンスタイルの技術が利用可能であれば、より良いかもしれません。
awk '/^reader_1 = newcamd\({/ { section_found = 1} /})/ { section_found = 0 } section_found && /port = 27020,$/ { sub(/27020,$/, "22443,") } { print }' file1 > file2 && mv file2 file1
説明する:
セクションの開始が見つかったらフラグを設定します。
/^reader_1 = newcamd\({/ {
section_found = 1
}
セクションの終わりが見つかったら、フラグをクリアします。
/})/ {
section_found = 0
}
右側のセクションと右側の行で新しいポート番号を置き換えます。
section_found && /port = 27020,$/ {
sub(/27020,$/, "22443,")
}
すべての行を印刷します。
{
print
}
出力をfile2(一時ファイル)に送信します。
> file2
すべて成功すると、file2 の名前を file1 に変更します。
&& mv file2 file1
必要に応じて正規表現を緩くまたは厳密にすることができます。
sed
このタイプのコードは、コードよりも読みやすく保守が簡単ですed
。特に、フォーマットが私が説明する方法に似ている場合はさらにそうです。