sed
BSD 및 GNU와 호환되기를 원하는 sed 대체 명령이 있습니다 sed
. 확장 정규식은 이 경우에는 필요하지 않으므로 문제가 되지 않습니다. 내 주요 문제는 두 가 sed
문자 이스케이프 시퀀스를 다르게 해석한다는 것입니다대안끈. 내 대체 문자열에는 탭과 개행 문자가 포함되어 있으며 더 쉬운 유지 관리를 위해 명령 문자열에 표시되기를 원합니다. 그러나 sed
GNU에서는 BSD가 이스케이프 시퀀스를 해석하지 않습니다.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.