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"