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


14

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?


2
BSD sed는 GNU sed가 아니며 출력에서 ​​이러한 탈출을 지원하지 않는다고 생각합니다. 리터럴 문자를 삽입하거나 GNU sed를 설치하거나 awk와 같은 이스케이프를 지원하는 것으로 전환해야합니다.
jw013

@ jw013, 두 가지를 구별하는 것이 분명합니다. GNU sed 설치는 옵션이 아닙니다. 나는 내가 함께하고있는 것을 성취하기 위해 두 사람 사이에 충분한 공통 근거를 찾기를 바랐습니다 sed. 결국 awk를 사용하는 것이 좋습니다. 내가 인용 한 BSD sed 맨 페이지의 해석에 대해 어떻게 생각하십니까?
ephsmith

2
그렇습니다. 리터럴 탭과 줄 바꿈을 사용해야하며 줄 바꿈과 함께 줄 바꿈 메커니즘을 사용하는 백 슬래시를 추가해야합니다.
jw013

@ jw013 감사합니다. 이 시점에서, 유지 관리를 위해 귀하의 조언을 듣고 솔루션을 awk로 다시 작성하겠습니다.
ephsmith

좋은 선택
-awk

답변:


6

이식 가능한 스크립트를 작성해야하는 경우 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 진 이스케이프를 포함하여 백 슬래시 이스케이프를 허용합니다 .


7

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.

3

이것은 스택 오버플로에서 답변되었습니다.

/programming/1421478/how-do-i-use-a-new-line-replacement-in-a-bsd-sed

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

리터럴 탭을 삽입하려면 ctrl+를 입력하십시오 VTab.


참조 주셔서 감사합니다. 내 Google 검색이 해당 링크를 반환하지 않는 것이 싫어 : D
ephsmith

1
ctrl-V 탭 제안은 셸에 따라 다릅니다. 예를 들어 물고기에서는 작동하지 않습니다.
anddam

물고기를 사용한 적이 없어 나는 알았지 만 알았습니다.
bahamat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.