\n 및 \t와 같은 이스케이프 시퀀스를 해석하도록 BSD sed에 지시하려면 어떻게 해야 합니까?

\n 및 \t와 같은 이스케이프 시퀀스를 해석하도록 BSD sed에 지시하려면 어떻게 해야 합니까?

sedBSD 및 GNU와 호환되기를 원하는 sed 대체 명령이 있습니다 sed. 확장 정규식은 이 경우에는 필요하지 않으므로 문제가 되지 않습니다. 내 주요 문제는 두 가 sed문자 이스케이프 시퀀스를 다르게 해석한다는 것입니다대안끈. 내 대체 문자열에는 탭과 개행 문자가 포함되어 있으며 더 쉬운 유지 관리를 위해 명령 문자열에 표시되기를 원합니다. 그러나 sedGNU에서는 BSD가 이스케이프 시퀀스를 해석하지 않습니다.sed 하다. sedBSD에서 이러한 이스케이프 시퀀스의 해석을 나타내는 적절한 방법은 무엇입니까? 다음 두 조각은 내 문제를 요약합니다.

암소 비슷한 일종의 영양sed

echo ABC | sed 's/B/\n\tB\n'

생산하다

A
    B
C

BSDsed

echo ABC | sed 's/B\n\tB\n'

생산하다

AntBnC

분명히 BSD는 \n해석하지 않으며 이스케이프 시퀀스로\tsed

이제 내 질문에 대답해 보세요. 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개행 문자는 정규 표현식과 대체 텍스트에서 다르게 표현되어야 한다는 점을 다시 한 번 참고하세요.

당신은 사용하고 싶을 수도 있습니다대신에. \ooo8진수 이스케이프를 포함하여 모든 문자열 리터럴에서 백슬래시 이스케이프를 허용합니다 .

답변3

이 질문은 Stack Overflow에 답변되어 있습니다.

https://stackoverflow.com/questions/1421478/how-do-i-use-a-new-line-replacement-in-a-bsd-sed

jw013이 말한 것과 거의 같습니다.

텍스트 탭을 삽입하려면 ctrl+ 를 입력하세요 VTab.

관련 정보