sed insert: 挿入された文字列の先行スペースを保持します。

sed insert: 挿入された文字列の先行スペースを保持します。

diffファイルの特定の行に挿入したい先行スペース(ファイルの結果から抽出)を持つ変数があります。可変的な:

add="     public function add($hardware_id = null)"

ただし、次のように行を挿入すると、先行sedスペースは印刷されません。

$ sed "50i$add" file
...
public function add($hardware_id = null)
...

先行スペースを維持する方法は?

答え1

変数を挿入するときに先行スペースを維持するには、単にエスケープしてください。一度\スペースの後にバックスラッシュが続きます。入れるコマンドはi次のとおりです。

$ sed '50i\'"$add" file
    public function add($hardware_id = null)

  1. 変数に限定されず、テキストを文字通り挿入すると同じ効果が得られます。

  2. これは、テキストを挿入する前にエスケープされたリテラル改行が必要なPOSIX指定の動作ではありません。

答え2

これを達成するための明確な方法は構文を使用することですi\。ただし、二重引用符で囲まれているので、バックスラッシュを使用しません。変数は改行とバックスラッシュをエスケープして、この操作に対して安全でなければなりません。

add='     public function add($hardware_id \= null
)'

#------------------------------
# make variable safe to use
# by escaping backslash n newline

esc_add=$(printf '%s\n' "$add" |
sed -e 's:\\:&&:g;$!s:$:\\:g')

sed -e "
  5i\\
$esc_add
" file | nl
     1  ABC
     2        2   3   4:blockA-1
     3        7   9   4:blockA-2
     4        1   2   5:blockA-3/
     5       public function add($hardware_id \= null
     6  )
     7  ABC
     8       13  11   17:blockB-1
     9       2   1    1:blockB-2/
    10  ABC
    11       7   9    14:blockC-1
    12       5   8    2:BlockC-2
    13       9   9    9:BlockC-3
    14       7   1    2:BlockC-4$

答え3

自分に依頼して使用するか、perl代わりにawkここsedで以下を実行してください。

add=$'  anything including \\backslash\\
and newline and even non\x80-text or overlong lines '

ADD=$add perl -pe '$_ = "$ENV{ADD}\n$_" if $. == 5' < "$file"

または(コンテンツに行が長すぎるかNULバイトがあると失敗する可能性がありますが、最初に改行がない場合は末尾の改行が追加されることに注意してください):

ADD=$add LC_ALL=C awk 'NR == 5 {$0 = ENVIRON["ADD"] ORS $0}; 1' < "$file"

関連情報