次のように、すべての\n
改行文字をエスケープシーケンスに置き換え、すべての単一引用符文字をそのうちの\n
2つにグローバルに変更したいと思います。'
''
function esc_foobar {
# Escapes any "'" single quotation character.
local -r esc_quot="s:':'':g"
# Escapes any "\n" new line character.
local -r esc_nl=':a;N;$!ba;s:\n:\\n:g'
# Escape everything in one sed run.
sed -- "$esc_quot;$esc_nl" foobar.txt
}
ファイルに以下が含まれていると仮定するとfoobar.txt
、
Foo's bar
Bar's foo
最初の一'
重引用符文字だけが2倍になります。
コマンドと置換の順序を変更するとesc_quot
機能します。つまり、すべての一重引用符文字が期待どおりに2倍になります。esc_nl
sed
$esc_nl;$esc_quot
'
なぜですか?
答え1
Sedを詳しく見て、具体的にSedのN
コマンドを理解しようとした後、私に適した以下の小さなSedスクリプトを考えました。
sed -- '$!N;s:\n:\\n:g;'"s:':'':g"
私の質問のSedスクリプトの2番目のバリエーションには、入力が奇数行の場合、最後の行を変更せずにそのままにする問題があります。