나는 찾을 \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는 \n
replace 패턴으로 해석되지 않지만 줄 연속 문자 앞에 리터럴 줄 바꿈을 사용할 수 있습니다. 쉘은 $'\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
조기 명령의 끝으로.