MacOS에서 sed에서 쉼표를 줄 바꿈으로 바꾸시겠습니까?


287

쉼표로 구분 된 ID 파일이 있습니다. 쉼표를 새 줄로 바꾸려고합니다. 난 노력 했어:

sed 's/,/\n/g' file

그러나 작동하지 않습니다. 내가 무엇을 놓치고 있습니까?


12
시도하십시오 tr , '\n'. sed는 \n일반 텍스트로 취급 됩니다.
프린스 존 웨슬리

1
작동했습니다! 고양이 파일 | TR, '\ n'을
WildBill

7
tr , '\n' < file-파이프가 없습니다.
프린스 존 웨슬리

g스크립트의 끝은 무엇입니까 ? 나는 그것없이 동일한 행동을 얻습니다.
HelloGoodbye

어떤 쉘을 사용하고 있습니까? 이것은 bash 쉘을 사용하여 나를 위해 작동합니다.
HelloGoodbye

답변:


362

tr대신 사용하십시오 :

tr , '\n' < file

'.'교체를 찾고있었습니다. 기간, 그리고 이것은 내가 찾고있는 해결책이었습니다 :)
Jonah

1
bash shell $ tr, '\ n'aitr 사용법은 다음과 같습니다 : tr [-Ccsu] string1 string2 tr [-Ccu] -d string1 tr [-Ccu] -s string1 tr [-Ccu] -ds string1 string2
학습자

5
세미콜론으로 쉼표를 tr ',' ';' < input.csv > output.csv
바꾸는

304

사용 ANSI-C 인용 문자열을 $'string'

sed를 사용하려면 백 슬래시로 이스케이프 된 리터럴 줄 바꿈이 필요합니다. bash에서 $''문자열은 \n실제 줄 바꿈으로 바뀌지 만 sed가 줄 바꿈을 피하기 위해 볼 수있는 백 슬래시를 두 배로 늘려야합니다.

echo "a,b" | sed -e $'s/,/\\\n/g'

참고 이 모든 쉘에서 작동하지 않습니다 ,하지만 가장 일반적인에서 작동합니다.


5
이상하게도 하나의 백 슬래시로도 작동합니다 echo "a,b" | sed -e $'s/,/\\n/g.
Alexandre Holden Daly

2
공감. 자세한 내용은의 "QUOTING"섹션을 참조하십시오 man bash.
tboyce12

7
OSX 10.11과 함께 작동했습니다 : sed -E $'s/<\\/br>/\\\n/g' file, gnu-sed를 설치할 필요가 없습니다
Brice

2
주어진 예제로 OS X 10.7에서 작동하는지 확인했습니다. 그 -e부분은 필요하지 않은 것 같습니다.
Yongwei Wu

1
대답의 예는 즉시 OSX 10.11.5에서 작동합니다.
Jurriaan Roelofs

122
sed 's/,/\
/g'

Mac OS X에서 작동합니다.


3
고마워-왜 내 오래된 리눅스 트릭이 OSX에서 작동하지 않는지 궁금해했다. 그러나 이것은 그렇습니다!
Wyatt8740

6
이것은 sed 스크립트에서 작동하는 유일한 솔루션입니다.
Firstrock

6
백 슬래시 리터럴 개행을 이스케이프 합니다 (명령 종결자가 아님). 이는 bash와 같이 줄 연속 문자 가 아닙니다 . 차이점을 보려면 따옴표없이 위의 명령을 작성하십시오. 백 슬래시는 대신 쉘에서 줄 연속 문자로 해석되어 줄 바꿈이 삭제됩니다. 반대로, 인용 된 표현식의 내용 (따옴표없이)을 별도의 쉼표 -newline.sed 파일 (쉘 구문 제거)에 포함하면 작동합니다!
Nils von Barth

1
캐릭터가 아닌 무엇이든 바꿀 수 있기 때문에 좋습니다. tr은 문자로만 작동하는 것 같습니다. 문자열을 첫 번째 매개 변수로 입력하면 문자열이 아닌 모든 문자가 바뀝니다.
Shawn

1
@Droogans bash, sh 또는 다른 쉘을 사용하고 있습니까? 큰 따옴표 대신 작은 따옴표를 사용하고 있습니까?
맥스 나나시

22

sed 사용법이 완전히 대체 표현 인 경우 (내 경향이 있음) perl -pe대신 사용할 수도 있습니다

$ echo 'foo,bar,baz' | perl -pe 's/,/,\n/g'
foo,
bar,
baz

15

분명히 \r열쇠입니다!

$ sed 's/, /\r/g' file3.txt > file4.txt

이것을 변형 :

ABFS, AIRM, AMED, BOSC, CALI, ECPG, FRGI, GERN, GTIV, HSON, IQNT, JRCC, LTRE,
MACK, MIDD, NKTR, NPSP, PME, PTIX, REFR, RSOL, UBNT, UPI, YONG, ZEUS

이에:

ABFS
AIRM
AMED
BOSC
CALI
ECPG
FRGI
GERN
GTIV
HSON
IQNT
JRCC
LTRE
MACK
MIDD
NKTR
NPSP
PME
PTIX
REFR
RSOL
UBNT
UPI
YONG
ZEUS

질문에 OS X가 있지만 GNU sed-4.2.2-6.fc20.x86_64에서는 작동하지 않습니다.
Cristian Ciupitu

10
명심 \r과 동일하지 않습니다 \n,이 추가 데이터 조작 및 사용을 중단 할 수도 있습니다.
Joel Purra

3
죄송합니다.이 기능이 작동하지 않습니다. 줄 바꿈이 있어야하는 곳에 'r'이 있습니다.
Frank de Groot-Schouten

이것이 제공하는 답변에서 더 명확하게해야합니다 \r!
pir

그것은 나를 위해 일했지만 왜 그런지 궁금합니다! \ n은 유닉스 stackoverflow.com/questions/1761051/difference-betn-n-and-n-and-rr
Alex

15

이것은 MacOS Mountain Lion (10.8), Solaris 10 (SunOS 5.10) 및 RHE Linux (Red Hat Enterprise Linux Server 릴리스 5.3, Tikanga)에서 작동합니다 ...

$ sed 's/{pattern}/\^J/g' foo.txt > foo2.txt

... + +를 ^J수행하여 수행됩니다 . 신경 마십시오 전과 .ctrlvj\^J

추신 : RHEL의 sed는 GNU이고 MacOS sed는 FreeBSD 기반이며 Solaris sed에 대해 잘 모르겠지만 이것이 sed와 거의 작동한다고 생각합니다. YMMV 토 ...


12

MacOS는 다릅니다 .Mac에서 sed 로이 문제를 해결하는 두 가지 방법이 있습니다

  • 먼저 \'$'\n''바꾸기를 사용 \n하면 MacOS에서 작동 할 수 있습니다.

    sed 's/,/\'$'\n''/g' file
    
  • 두 번째는 빈 줄을 사용하십시오.

    sed 's/,/\
    /g' file
    
  • 추신. 범위를 구분하여주의하십시오 '

  • 셋째, gnu-sed를 사용하여 mac-sed를 교체하십시오.


7

완료하려면 다음도 작동합니다.

echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"

1
Bash;)를 제외하고 난독 화 된 C 콘테스트에도 적합 할 것입니다.
Aaron R.

@AaronR. 나는 동의한다 :-). 분명히 나는 tr이미 받아 들여진 해결책 인 해결책을 선호합니다 .
Ryenus

1
이것은 OS X에서 작동했습니다. 왜 \n\r대신에 \r\n입니까? 나는 시도했다\r\nWindows에서 필요한 순서를 . 나는이 작업을 수행 한 후 그러나, 많은 떠나고 ^M에 캐리지 리턴 문자를 vim내가 만해야하는데 생각 때문에, \n하지만 \n혼자 일을하지 않습니다.
NobleUplift

4

이 게시물에 늦었지만 결과를 업데이트하기 만했습니다. 이 답변은 Mac OS X 에만 해당됩니다.

$ sed 's/new/
> /g' m1.json > m2.json
sed: 1: "s/new/
/g": unescaped newline inside substitute pattern

위의 명령에서 Shift + Enter를 사용하여 작동하지 않는 새 줄을 추가했습니다. 그래서 이번에는 오류에서 알 수 있듯이 "이스케이프되지 않은 줄 바꿈"을 "이스케이프 처리"하려고했습니다.

$ sed 's/new/\
> /g' m1.json > m2.json 

일했다! (Mac OS X 10.9.3에서)


이것은 2 년 전 Max Nanasy의 답변과 다르지 않습니다.
miken32

2

OSX (10.8; Darwin Kernel Version 12.4.0)에서 sed 맨 페이지는 다음과 같이 말합니다.

[...]

Sed 정규식

 The regular expressions used in sed, by default, are basic regular expressions (BREs, see re_format(7) for more information), but extended
 (modern) regular expressions can be used instead if the -E flag is given.  In addition, sed has the following two additions to regular
 expressions:

 1.   In a context address, any character other than a backslash (``\'') or newline character may be used to delimit the regular expression.
      Also, putting a backslash character before the delimiting character causes the character to be treated literally.  For example, in the
      context address \xabc\xdefx, the RE delimiter is an ``x'' and the second ``x'' stands for itself, so that the regular expression is
      ``abcxdef''.

 2.   The escape sequence \n matches a newline character embedded in the pattern space.  You cannot, however, use a literal newline charac-
      ter in an address or in the substitute command.

[...]

위에서 언급 한 것처럼 tr을 사용해야한다고 생각합니다.

sed "s/,/^M
/g"

참고 : vi 편집기에서 '^ M'을 얻으려면 < ctrl> -v, < return> 을 입력해야합니다



1

sed하나 개의 솔루션이 설치하는 것입니다, 그래서 맥 OS 모하비는 2005 년 출시 된에 gnu-sed,

brew install gnu-sed

사용 gsed하면 원하는대로 사용할 수 있습니다.

gsed 's/,/\n/g' file

당신이 선호하는 경우 sed, 그냥 sudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew'제안합니다 brew info gnu-sed. 용어를 다시 시작하면 sed명령 줄이 gsed입니다.


0

FWIW, 다음 줄은 창에서 작동하며 경로 변수의 세미콜론을 줄 바꿈으로 바꿉니다. 내 git bin 디렉토리에 설치된 도구를 사용하고 있습니다.

echo %path% | sed -e $'s/;/\\n/g' | less
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.