sed式(およびArchLinuxのGNU sed 4.2.2)が提供されます。
/match/i\tline1\n\tline2
一致の上にタブにインデントされた2行を挿入する必要があります。最初の文字(例では\t
)のエスケープは無視されますが、他のエスケープ文字はすべて正しく処理されることがわかりました。
次のようにテストしてください。
echo match | sed -e '/match/i\tline1\n\tline2'
明らかにする
tline1
line2
match
初期エスケープ文字(タブや改行など)に関係なく、結果は同じです。最初の文字が正しく処理されるように式を構成する正しい方法は何ですか?
答え1
Gnu sedのマニュアルを確認してください(http://www.gnu.org/software/sed/manual/html_node/Other-Commands.html#Other-Commands) -i
コマンドは実際にはi\
コマンドなので、追加のバックスラッシュだけが必要です。
echo match | sed -e '/match/i\\tline1\n\tline2'
# ---------------------------^
答え2
標準構文(GNU以外のシステムに移植する場合)は次のとおりです。
sed 'i\
\ line1\
line2'
つまり、末尾の改行文字が必要であり、エスケープシーケンスはi\
認識されません(上記のタブ文字は文字通り入力されます)。単に、改行、バックスラッシュ文字、および先行スペースをエスケープするには、バックスラッシュを使用する必要があります。
(非標準sh
)ksh$'...'
型引用符(たとえば、ksh93
またはzsh
)bash
をサポートするシェルの場合は、次のように書くことができます。
sed $'i\\\n\\\tline1\\\nline2'
1 POSIX互換sでは、先行スペースの前にバックスラッシュは必要ありsed
ませんが、一部の実装(BSDの実装など)では、まだバックスラッシュなしで先行スペースを削除します。。
答え3
私は以下を提案しようとしました:
echo match | sed -e 's/match/\tline1\n\tline2\n&/'