쉼표로 구분 된 ID 파일이 있습니다. 쉼표를 새 줄로 바꾸려고합니다. 난 노력 했어:
sed 's/,/\n/g' file
그러나 작동하지 않습니다. 내가 무엇을 놓치고 있습니까?
tr , '\n' < file-파이프가 없습니다.
g스크립트의 끝은 무엇입니까 ? 나는 그것없이 동일한 행동을 얻습니다.
쉼표로 구분 된 ID 파일이 있습니다. 쉼표를 새 줄로 바꾸려고합니다. 난 노력 했어:
sed 's/,/\n/g' file
그러나 작동하지 않습니다. 내가 무엇을 놓치고 있습니까?
tr , '\n' < file-파이프가 없습니다.
g스크립트의 끝은 무엇입니까 ? 나는 그것없이 동일한 행동을 얻습니다.
답변:
사용 ANSI-C 인용 문자열을 $'string'
sed를 사용하려면 백 슬래시로 이스케이프 된 리터럴 줄 바꿈이 필요합니다. bash에서 $''문자열은 \n실제 줄 바꿈으로 바뀌지 만 sed가 줄 바꿈을 피하기 위해 볼 수있는 백 슬래시를 두 배로 늘려야합니다.
echo "a,b" | sed -e $'s/,/\\\n/g'
참고 이 모든 쉘에서 작동하지 않습니다 ,하지만 가장 일반적인에서 작동합니다.
echo "a,b" | sed -e $'s/,/\\n/g.
man bash.
sed -E $'s/<\\/br>/\\\n/g' file, gnu-sed를 설치할 필요가 없습니다
-e부분은 필요하지 않은 것 같습니다.
sed 's/,/\
/g'
Mac OS X에서 작동합니다.
분명히 \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
\r과 동일하지 않습니다 \n,이 추가 데이터 조작 및 사용을 중단 할 수도 있습니다.
\r!
이것은 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 토 ...
완료하려면 다음도 작동합니다.
echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"
tr이미 받아 들여진 해결책 인 해결책을 선호합니다 .
\n\r대신에 \r\n입니까? 나는 시도했다\r\nWindows에서 필요한 순서를 . 나는이 작업을 수행 한 후 그러나, 많은 떠나고 ^M에 캐리지 리턴 문자를 vim내가 만해야하는데 생각 때문에, \n하지만 \n혼자 일을하지 않습니다.
이 게시물에 늦었지만 결과를 업데이트하기 만했습니다. 이 답변은 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에서)
OSX (10.8; Darwin Kernel Version 12.4.0)에서 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> 을 입력해야합니다
$ echo $PATH | sed -e $'s/:/\\\n/g'
/usr/local/sbin
/Library/Oracle/instantclient_11_2/sdk
/usr/local/bin
...
모하비에서 나를 위해 작동
tr , '\n'. sed는\n일반 텍스트로 취급 됩니다.