sed を使用して行全体を文字を含む別の行に置き換える方法

sed を使用して行全体を文字を含む別の行に置き換える方法

ファイルの19行目には以下が含まれています。

send -- "[email protected]\r"

メールアドレスを変更したいので、考えてみました

sed -i.bak '19s/.*/send -- "[email protected]\r"/' ./a

19行目は変更されますが、私が得るのは

"end -- "[email protected]

何が問題なのでしょうか、またそれをどのように修正すればよいのでしょうか?

答え1

sedバックスラッシュはパターン内のエスケープ文字なので、リテラルキャリッジリターンが挿入されます。必要なのは\\r、エスケープされたバックスラッシュの後にリテラルが続くことですr

答え2

検索と置換を行う代わりに、19 行目を変更するだけで済みます。

sed '19c\send -- "[email protected]\\r"'

答え3

必要以上に難しくしすぎています。行全体ではなく、電子メール アドレスだけを変更してください。例を示します。

$ echo 'send -- "[email protected]\r"'  | sed 's/old@example\.com/[email protected]/'
send -- "[email protected]\r"

ちなみに、検索パターンが 1 行に複数回出現する可能性がある場合は、オプションでgコマンド コマンドの末尾に (global) 修飾子を使用できます。また、大文字と小文字を区別しない検索を行う場合は (ignore case) 修飾子を使用できます (つまり、両方を使用する場合) 。s///is/old@example\.com/[email protected]/ig

とにかく、コマンドは次のようになります。

sed -i.bak '19s/old@example\.com/[email protected]/' ./a

変更する正確な行番号がわからない場合は、行番号ではなく、正規表現を行アドレスとして指定します。

sed -i.bak '/^send.*old@example\.com/ s/old@example\.com/[email protected]/' ./a

すべての出現箇所を変更するのはさらに簡単です[メールアドレス]ファイル内でアドレスを指定する必要はなく、ファイルのすべての行で置換が行われます。

sed -i.bak 's/old@example\.com/[email protected]/' ./a

関連情報