쉼표로 구분 된 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\n
Windows에서 필요한 순서를 . 나는이 작업을 수행 한 후 그러나, 많은 떠나고 ^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
일반 텍스트로 취급 됩니다.