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"

관련 정보