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)
変数に限定されず、テキストを文字通り挿入すると同じ効果が得られます。
これは、テキストを挿入する前にエスケープされたリテラル改行が必要な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"