ハマったこと
sedで &
を含む文字に置換しようとする場合は一手間必要です。
REPLACE_TARGET_STRING
を123&456
に置換する場合を考えます。
❯ cat replace.txt
REPLACE_TARGET_STRING
普通にsedを実行すると下記のような出力結果となり、意図した結果となりません。
❯ sed -e "s@REPLACE_TARGET_STRING@123&456@g" replace.txt
123REPLACE_TARGET_STRING456
というのも、sedの 置換後文字列 の中に &
が存在する場合、これは置換前の文字列(この場合、REPLACE_TARGET_STRING)に置き換えられます。(知らなかった)
❯ man sed
(略)
An ampersand (``&'') appearing in the replacement is replaced by
the string matching the RE. The special meaning of ``&'' in this
context can be suppressed by preceding it by a backslash.
バックスラッシュをつけてエスケープすることで、意図した結果を得ることができます。
❯ sed -e "s@REPLACE_TARGET_STRING@123\&456@g" replace.txt
123&456
知っている人も多い気がしますが、僕は全然知らなかったのでメモ。