ファイルの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///
i
s/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