sed
GNU뿐만 아니라 BSD 와 호환되기를 원하는 sed replacement 명령이 있습니다 sed
. 이 경우 확장 정규 표현식은 필요하지 않으므로 문제가되지 않습니다. 내 주요 문제는 두 문자열 sed
이 대체 문자열 의 문자 이스케이프 시퀀스를 해석 하는 방식의 차이입니다 . 대체 문자열에는 탭과 줄 바꿈이 포함되어 있으며 유지 보수를 쉽게하기 위해 명령 문자열에 표시되기를 원하지만 BSD sed
는 이스케이프 시퀀스를 해석하지 않으며 GNU sed
는 그렇게 합니다. sed
BSD에서 이러한 이스케이프 시퀀스를 해석 하도록 지시하는 적절한 방법은 무엇입니까 ? 다음 두 스 니펫은 내 문제를 잘 보여줍니다.
암소 비슷한 일종의 영양 sed
echo ABC | sed 's/B/\n\tB\n'
예 일드
A
B
C
BSD sed
echo ABC | sed 's/B\n\tB\n'
수확량
AntBnC
분명히, \n
그리고 \t
BSD로 이스케이프 시퀀스로 해석되지 않는다sed
이제 내 질문에. BSD sed
맨 페이지 에 따르면 :
대체 문자열에 개행 문자를 지정하려면 앞에 백 슬래시를 사용하십시오.
이것은 백 슬래시 로 리터럴 개행 을 선행해야한다는 것을 의미합니까 ? 대체 텍스트 sed
와 같이 이스케이프 시퀀스를 해석 하도록 지시하는 적절한 방법은 무엇입니까 \n
?
답변
이식 가능한 스크립트를 작성해야하는 경우 POSIX 표준의 기능 (일명 Open Unix 또는 Open Group Base Specification)을 고수해야합니다 . 이슈 7 일명 POSIX-1.2008 은 최신 버전이지만 많은 시스템에서 아직 채택을 완료하지 못했습니다. 이슈 6 일명 POSIX-1.2001 은 모든 현대 유니스 가 제공합니다.
에서 나오지도 , 등 이스케이프 시퀀스의 의미 \t
와는 \n
것을는 제외하고, 이식 할 수 없습니다 정규식 , \n
줄 바꿈을 의미합니다. s
명령 의 대체 텍스트에서 \n
이식 가능하지 않지만 시퀀스 백 슬래시-줄 바꾸기를 사용하여 줄 바꾸기를 나타낼 수 있습니다.
탭 문자 (또는 8 진수로 표현 된 다른 문자)를 생성하는 이식 가능한 방법은입니다 tr
. 문자를 쉘 변수에 저장하고이 변수를 sed 코드 조각으로 대체하십시오.
tab=$(echo | tr '\n' '\t')
escape=$(echo | tr '\n' '\033')
embolden () {
sed -e 's/^/'"$escape"'[1m/' -e 's/$/'"$escape"'[0m/'
}
줄 바꿈은 정규 표현식과 s
대체 텍스트 에서 다르게 표현되어야 합니다.
대신 awk 를 사용하고 싶을 수도 있습니다 . \ooo
모든 문자열 리터럴에서 8 진 이스케이프를 포함하여 백 슬래시 이스케이프를 허용합니다 .
답변
bash $'...'
따옴표를 사용 하여 문자열을에 전달하기 전에 이스케이프를 해석 할 수 있습니다 sed
.
bash 매뉴얼 페이지에서 :
Words of the form $'string' are treated specially. The word
expands to string, with backslash-escaped characters replaced as
specified by the ANSI C standard. Backslash escape sequences, if
present, are decoded as follows:
\a alert (bell)
\b backspace
\e an escape character
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab
\\ backslash
\' single quote
\nnn the eight-bit character whose value is the octal
value nnn (one to three digits)
\xHH the eight-bit character whose value is the hexadeci-
mal value HH (one or two hex digits)
\cx a control-x character
The expanded result is single-quoted, as if the dollar sign had
not been present.
A double-quoted string preceded by a dollar sign ($) will cause
the string to be translated according to the current locale. If
the current locale is C or POSIX, the dollar sign is ignored. If
the string is translated and replaced, the replacement is double-
quoted.
답변
이것은 스택 오버플로에서 답변되었습니다.
/programming/1421478/how-do-i-use-a-new-line-replacement-in-a-bsd-sed
jw013이 말한 것과 거의 같습니다.
리터럴 탭을 삽입하려면 ctrl+를 입력하십시오 VTab.