エスケープ文字を含む sed 式を構成する方法

エスケープ文字を含む sed 式を構成する方法

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またはzshbashをサポートするシェルの場合は、次のように書くことができます。

sed $'i\\\n\\\tline1\\\nline2'

1 POSIX互換sでは、先行スペースの前にバックスラッシュは必要ありsedませんが、一部の実装(BSDの実装など)では、まだバックスラッシュなしで先行スペースを削除します。

答え3

私は以下を提案しようとしました:

 echo match | sed -e 's/match/\tline1\n\tline2\n&/'

関連情報