Mac OS X에서 sed의 줄 바꿈


44

나는 찾을 \n특히, 나는 단어 라인에 하나의 공백으로 구분 헤어지고 싶어 맥 OS X의에서 나오지도에없는 일을 말하는가 :

# input
foo bar

나는 사용한다,

echo "foo bar" | sed 's/ /\n/'

그러나 결과는 어리 석고, \n탈출하지 않습니다!

foonbar

Google에 문의 한 후 해결 방법을 찾았습니다 .

echo 'foo bar' | sed -e 's/ /\'$'\n/g'

기사를 읽은 후에도 여전히 무슨 \'$'\n/g'의미 인지 이해할 수 없습니다 . 누군가 나에게 그것을 설명 할 수 있습니까? 아니면 다른 방법이 있습니까? 감사!


이것은 아마도 일하는 것이 너무 :echo "foo bar" | tr ' ' '\n'
— 글렌 잭맨

3
충고 감사합니다. 그러나 현재 위의 경우를 예로 사용하여을 탈출하는 방법을 알아야합니다 \n.
— Ivan ZG Xiao

답변:


27

당신은 할 수 brew install gnu-sed과에 전화를 교체 sed와 함께 gsed.

당신은 "g"를 앞에 추가하지 않으려면합니다 sed, 당신은 할 수 brew install gnu-sed --with-default-names그냥 전화 sed.

(편집 : 클레어에 brew 플래그, 모자 팁 업데이트


모든 플랫폼에서 동일한 소프트웨어를 사용하는 것이 Mac 버전의 모든 특성을 다루는 것보다 훨씬 쉽습니다. 옵션 지금,주의 --with-default-names및 없습니다 --default-names . 내가 넣어했다, 그래서 그러나이 옵션은 내 설치에 근무하지 않았다 alias gsed=sed내에서 ~/.profile그것을 확인하는 작업.
— Clément

4
이것은 추악한 해결 방법입니다. sedOS X에서 작동 방식을 설명 하고 gnu-sed더 정확한 잘못된 가정을 만드는 이유 는 설명하지 않습니다 . GNU 중독자가 아니며 POSIX 표준을 준수하여 장기적으로 문제를 피하십시오.
— octosquidopus

Apple이 기본적으로 OS를 작동시키는 방법입니다. 프로그램 이름을 사용한 다음 다르게 작동하는 이유는 무엇입니까? 나는 이것 때문에 한 시간을 낭비합니다.
— rascio

@rascio-OS X는 BSD와 같고 Linux는 Linux와 비슷합니다.
— iAdjunct

@rascio GNU sed가 새로 등장한 것 같습니다. BSD sed는 1979 년으로 거슬러 올라갑니다 ( en.wikipedia.org/wiki/Version_7_Unix 참조 ).
— Duncan Bayne

24

이것들은 또한 작동합니다 :

echo 'foo bar' | sed 's/ /\
/g'

echo 'foo bar' | sed $'s/ /\\\n/g'

lf=$'\n'; echo 'foo bar' | sed "s/ /\\$lf/g"

OS X의 sed는 \nreplace 패턴으로 해석되지 않지만 줄 연속 문자 앞에 리터럴 줄 바꿈을 사용할 수 있습니다. 쉘은 $'\n'sed 명령이 실행되기 전에 리터럴 줄 바꾸기로 바뀝니다 .


4
왜 sed $'s/ /\\\n/g'작동하지만 작동하지 sed $'s/\\\n/ /g'않습니까?
— Alec Jacobson

1
@alec sedlinux / unix에서도 개행을 파싱 / 분할하여 개행을 제거하기 위해 사용할 수 없습니다 . 이것을 리눅스 / 유닉스에서 실행한다면, 아무것도하지 않을 것이다 :echo -e 'foo\nbar' | sed 's/\n//'
— wisbucky

10

찾은 해결 방법은 단일 인수 문자열을에 전달합니다 sed -e.

그 주장은 익숙한 sed s/ / /g형식 의 문자열이 됩니다.

이 문자열은 두 부분으로 만들어집니다.

첫 번째 부분은 '...'양식 으로 인용됩니다 .

두 번째 부분은 $'...'형식 으로 인용됩니다 .

's/ /\'부분은 벗겨 단일 따옴표를 얻을 수 있지만, 그렇지 않으면 명령 줄에 보이는대로 나오지를 통해 전달합니다. 즉, 백 슬래시는 배쉬에서 먹지 않고 sed로 전달됩니다.

$'\n/g'부분은 달러 기호 및 벗겨 단일 따옴표를 얻을하고는 \n개행 문자로 변환됩니다.

모두 함께 논쟁은

s / / \ newline/ g

[재미있었습니다. 그것을 풀기 위해 잠시 걸렸다. 흥미로운 질문에 +1]


7

표현 $'...'은 표준 이스케이프 시퀀스가 ​​확장 된 상태에서 bash생성 되는 -ism입니다 .... 그 \'전에 인용 된 섹션의 끝이 뒤에 오는 백 슬래시를 의미하는 결과 문자열은 s/ /\입니다. (예, 문자열 중간에 인용을 전환 할 수 있으며 문자열을 끝내지 않습니다.)

POSIX 표준 은 검색 패턴의 일부로 sed만 허용 \n됩니다. OS X sed은 엄격하게 POSIX를 준수 하는 FreeBSD를 사용합니다 . 평소와 같이 GNU는 추가 기능을 추가 한 다음 Linux 사용자 는 일종의 "표준" 이라고 생각 합니다 (표준 프로세스가있을 경우 더 인상적 일 수 있습니다).


이제 나는 그 $'...'부분을 이해합니다 . 하지만 ... 뭐야 s/ /\ ? 무슨 뜻 switch quoting인가요?
— Ivan ZG Xiao

2
'...'쉘 인용의 한 종류입니다. $'...'또 다른 것입니다. 이이기도 "..."하고 \x단일 문자를 인용. 그것들을 한 단어로 결합 할 수 있습니다. 이것은 일반 ''문자열에서 $''문자열로 변환하여 번역합니다 \n. 나머지는 sed명령 ( s/text/replacement/flags)을 작성합니다. 이 경우 $'\n/g'추가 되는 리터럴 개행을 보호하기 위해 끝에 백 슬래시를 포함하여 명령이 시작 됩니다. 결과적으로 모든 ( /g플래그) 공간을 줄 바꿈으로 바꿉니다.
— geekosaur

1

무슨 일이 일어나고 있는지 시각적으로 쉽게 볼 수 있습니다. 간단히 문자열을 에코하십시오!

echo 's/$/\'$'\n/g'

결과

s/$/\
/g

어느 것이 s/$/\newline/g

당신이 추가되어 있지 않은 경우 \전과 newline, 쉘은 해석 것이다 newline조기 명령의 끝으로.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.