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

sedGNU뿐만 아니라 BSD 와 호환되기를 원하는 sed replacement 명령이 있습니다 sed. 이 경우 확장 정규 표현식은 필요하지 않으므로 문제가되지 않습니다. 내 주요 문제는 두 문자열 sed대체 문자열 의 문자 이스케이프 시퀀스를 해석 하는 방식의 차이입니다 . 대체 문자열에는 탭과 줄 바꿈이 포함되어 있으며 유지 보수를 쉽게하기 위해 명령 문자열에 표시되기를 원하지만 BSD sed는 이스케이프 시퀀스를 해석하지 않으며 GNU sed 는 그렇게 합니다. sedBSD에서 이러한 이스케이프 시퀀스를 해석 하도록 지시하는 적절한 방법은 무엇입니까 ? 다음 두 스 니펫은 내 문제를 잘 보여줍니다.

암소 비슷한 일종의 영양 sed

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

예 일드

A
    B
C

BSD sed

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

수확량

AntBnC

분명히, \n그리고 \tBSD로 이스케이프 시퀀스로 해석되지 않는다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.


답변