sed에서 \ n을 줄 바꿈으로 바꾸십시오.


23

GNU sed, POSIX sed및 BSD sed의 수많은 옵션 과 혼동됩니다 . \n이 세 가지 sed유형을 사용하여 리터럴 을 개행 문자로 바꾸려면 어떻게합니까 ?


그들은 많은 다른 것들을 가지고 있습니다. 당신은 어떤 부분을 알고 싶습니까?
cuonglm

@ Gnouc 나는 지금 분명하다고 생각합니다.
Avinash Raj

1
이 질문을 보셨습니까 ?
groxxda

2
foo\\nbar또는 같은 입력에서 어떤 일이 일어나기를 원 foo\\\nbar하십니까?
Gilles 'SO- 악한 중지'

간단합니다, 다음 줄에서 foo \\는 bar입니다.
Avinash Raj

답변:


30
sed 's/\\n/\
/g'

대체 문자열에서 return 키를 누르기 직전에 백 슬래시를 확인하십시오.


이것은 모든 종류의 sed에 적용됩니까?
Avinash Raj

나는 그것이 믿어야한다. gnu 버전을 사용하는 Linux에서만 테스트했습니다.
unxnut

11
@AvinashRaj. POSIX이며 sed1979 년 Unix v7 의 원래 명령으로 작업했습니다 . 작동하지 않을 수있는 유일한 위치 sed는 일부 비 처리 된 비지 박스 기반의 비 POSIX 비 구현 구현 입니다. 그것은 csh에서는 작동하지 않지만 csh 문제입니다.
Stéphane Chazelas

이후 \\n검색 부분에 사용되는, 왜 사용하지 \n바꾸기에? 전자는 후자가 존재하는 것을 암시하는 것으로 보인다. 즉. 왜 그렇지 $ echo '1\n2'|sed 's/\\n/\n/g'

이 경우 \n리터럴은 두 개의 문자 (백 슬래시 다음에 n이며 단일 개행 문자가 아님)로 표시됨을 의미합니다 . 따라서 백 슬래시를 리터럴로 만드는 두 개의 백 슬래시n
unxnut

9

이미 휴대용 sed답변 이 있으므로 줄 sed바꿈을 조작 해야하는 경우 거의 최고의 도구 라고 언급 하지는 않습니다. Perl은 거의 이식성이 뛰어나고 sed대부분의 * nix 시스템에 기본적으로 설치되며이를 매우 쉽게 처리 할 수 ​​있습니다.

printf '%s\n' 'aa\nbb' | perl -pe 's/\\n/\n/g'

또 다른 휴대용 선택은 awk다음과 같습니다.

printf '%s\n' 'aa\nbb' | awk  '{gsub("\\\\n","\n")};1'

Solaris에서는 / usr / xpg4 / bin에 표준 awk를 사용해야합니다. / bin에있는 것은 역사적인 것으로 새 스크립트에는 사용해서는 안됩니다.


내가 말하고 싶지만 awk유사한 이식성 문제가 (내인가 awk평범한 구식 awk, nawk또는 gawk?). 실제로 내 Solaris 상자의 버전에는이 없습니다 gsub(). 내 투표는 Perl에 대한 것입니다 ( perl -nlawe '...'의 자동 행동과 비슷 함 awk).
arielCo

2
@arielCo : awk이식성을 위해 awkPOSIX 호환 버전을 고수하고 해당 기능 만 사용하면됩니다. Solaris에서는 다음과 같은 것을 찾을 수 있습니다 /usr/xpg4/bin/awk.
감시자


@arielCo 실제로 awk는 perl 보다 이식성 이 뛰어납니다 . 사용하지 않는 두 번째 awk 접근 방식은 gsub()거의 모든 곳에서 작동해야합니다. busybox도 있습니다 awk.
terdon

1
gsub ()는 POSIX입니다 (gsub는 SVR3.1에 추가되었으며 POSIX awk는 SVR4를 기반으로하며 추가 된 내용은 gawk 매뉴얼을 참조하십시오). gensub ()는 GNU 확장입니다. 원래 awk는 여전히 Solaris에서 / bin / awk로 발견되어 gsub ()를 지원하지 않았지만 다중 문자 FS도 지원하지 않았습니다.
Stéphane Chazelas

1

경우 Holdspace이 당신도 할 수 비우 :

sed '/\\n/G;s/\\n\(.*\)\(.\)/\2\1/;P;D'

... 그러나 uxnut의 답변 은 이미 더 빠르고 간단하므로 원하는대로 취할 수 있습니다.

또 다른 외부 가능성 :

INPUT | sed -n l | while read v ; do printf "${v%?}" ; done

그러나 ^ ackspace 및 eturn 및 8 진과 \같은 모든 표준 C 스타일 백 슬래시 이스케이프 를 변환합니다 .\b\r\00



-2

sed에 솔루션이 필요하며 아래에 이미 나와 있습니다. 하지만 IMHO가 더 쉽고 빠르다는 또 다른 가능성을 추가하고 싶었습니다.

tr -d "\n"

1
이것은 무엇을 하는가? 입력에서 모든 줄 바꿈을 삭제 하시겠습니까?
mikeserv

예, 그것이 정확히하는 것입니다
jpmuc

5
하지만 ... 왜? 그것은 그 질문과 전혀 관련이 있습니까?
mikeserv

1
질문에 문자열 "\ n"을 실제 줄 바꿈으로 바꾸는 방법을 묻는 경우 "\ n"만 제거됩니다.
spuder
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.