ファイルのある文字列を別の文字列に置き換える

ファイルのある文字列を別の文字列に置き換える

次の構成ファイルがたくさんあります。

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引用符付きコマンド文字列が送信されます。コマンドは次のとおりです。

  1. /^reader_1 =- "reader_1 ="で始まる行を検索する
  2. /^port =- そこから「port =」で始まる行を前方に検索します。
  3. c- この行を変更してください
  4. port = 22443,- 本文に移動
  5. .- 代替テキストの終わり
  6. w--ディスクにファイルを書き込む
  7. q- 辞職するed

実際のデータに基づいて、ある程度慎重に一致するように正規表現を強化または緩めることができます。

答え2

私は、、などがあるとreader_0仮定します。host = hostanme 1reader_1host = 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。特に、フォーマットが私が説明する方法に似ている場合はさらにそうです。

関連情報