이스케이프 문자를 포함하는 sed 표현식을 구성하는 방법

이스케이프 문자를 포함하는 sed 표현식을 구성하는 방법

sed 표현식(및 ArchLinux의 GNU sed 4.2.2)이 제공됩니다.

/match/i\tline1\n\tline2

일치 항목 위에 탭으로 들여쓰기된 두 줄을 삽입해야 합니다. 첫 번째 문자(예제에서 \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, zsh또는 bash)를 지원하는 쉘의 경우 다음과 같이 작성할 수 있습니다.

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

1 POSIX 호환 s에서는 선행 공백 앞에 백슬래시가 필요하지 sed않지만일부 구현(예: BSD의 구현)에서는 여전히 백슬래시 없이 선행 공백을 제거합니다..

답변3

나는 다음을 제안하려고 했다:

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

관련 정보