sed
BSD 및 GNU와 호환되기를 원하는 sed 교체 명령이 있습니다 sed
. 확장 정규식은 이 경우에는 필요하지 않으므로 문제가 되지 않습니다. 내 주요 문제는 두 sed
s가 문자 이스케이프 시퀀스를 해석하는 방식의 차이입니다.대사문자열. 내 대체 문자열에는 탭과 개행 문자가 포함되어 있으며 유지 관리가 쉽도록 명령 문자열에 표시하고 싶지만 BSD는 sed
이스케이프 시퀀스와 GNU를 해석하지 않습니다.sed
하다. sed
BSD에서 이러한 이스케이프 시퀀스를 해석하도록 지시하는 적절한 방법은 무엇입니까 ? 다음 두 조각은 내 문제를 잘 보여줍니다.
암소 비슷한 일종의 영양sed
echo ABC | sed 's/B/\n\tB\n'
수확량
A
B
C
BSDsed
echo ABC | sed 's/B\n\tB\n'
수확량
AntBnC
분명히 BSD에서는 이스케이프 시퀀스로 해석되지 않습니다 \n
.\t
sed
이제 내 질문에. BSD sed
맨페이지에 따르면:
대체 문자열에 개행 문자를 지정하려면 그 앞에 백슬래시를 추가하세요.
이것은 내가오자백슬래시로 개행을 합니까? 대체 텍스트 sed
와 같은 이스케이프 시퀀스를 해석하도록 지시하는 적절한 방법은 무엇입니까 ?\n
답변1
$'...'
문자열을 에 전달하기 전에 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.
답변2
이식 가능한 스크립트를 작성해야 하는 경우 다음의 기능을 고수해야 합니다.POSIX 표준(일명 단일 Unix, 개방형 그룹 기본 사양).이슈 7(일명 POSIX-1.2008)최신이지만 많은 시스템에서 아직 채택을 완료하지 않았습니다.이슈 6(일명 POSIX-1.2001)대체로 모든 현대 유니스에서 제공됩니다.
~ 안에sed\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
개행 문자는 정규 표현식과 대체 텍스트 에서 다르게 표현되어야 한다는 점을 다시 한 번 참고하세요 .
당신은 사용하고 싶을 수도 있습니다앗대신에. \ooo
모든 문자열 리터럴에서 8진수 이스케이프를 포함하여 백슬래시 이스케이프를 허용합니다 .
답변3
이것은 Stack Overflow에서 답변되었습니다.
https://stackoverflow.com/questions/1421478/how-do-i-use-a-new-line-replacement-in-a-bsd-sed
jw013이 말한 것과 거의 똑같습니다.
리터럴 탭을 삽입하려면 ctrl+ 를 입력하세요 VTab.