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&/'