Mac OS X에서 sed의 줄 바꿈 않습니다! foonbar Google에 문의 한 후 해결 방법을

나는 찾을 \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'의미 인지 이해할 수 없습니다 . 누군가 나에게 그것을 설명 할 수 있습니까? 아니면 다른 방법이 있습니까? 감사!



답변

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

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

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


답변

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

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 명령이 실행되기 전에 리터럴 줄 바꾸기로 바뀝니다 .


답변

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

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

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

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

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

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

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

모두 함께 논쟁은

s / / \ newline/ g

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


답변

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

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


답변

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

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

결과

s/$/\
/g

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

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