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

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

sedBSD 및 GNU와 호환되기를 원하는 sed 교체 명령이 있습니다 sed. 확장 정규식은 이 경우에는 필요하지 않으므로 문제가 되지 않습니다. 내 주요 문제는 두 seds가 문자 이스케이프 시퀀스를 해석하는 방식의 차이입니다.대사문자열. 내 대체 문자열에는 탭과 개행 문자가 포함되어 있으며 유지 관리가 쉽도록 명령 문자열에 표시하고 싶지만 BSD는 sed이스케이프 시퀀스와 GNU를 해석하지 않습니다.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개행 문자는 정규 표현식과 대체 텍스트 에서 다르게 표현되어야 한다는 점을 다시 한 번 참고하세요 .

당신은 사용하고 싶을 수도 있습니다대신에. \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.

관련 정보