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.