빠른 답변
sed ':a;N;$!ba;s/\n/ /g' file
- : a 라벨 'a'를 만듭니다.
- N 다음 줄을 패턴 공간에 추가
- $! 하지의 마지막 줄 경우 , 바 분기 라벨 'A'(에 이동)
- 의 대체 , / \ n / 새로운 라인에 대한 정규식 , / / 공백으로 , / g 글로벌 경기 (여러 번 그것을 할 수있는)
sed는 마지막 줄에 도달 할 때까지 1 단계에서 3 단계까지 반복하여 모든 줄이 패턴 공간에 맞도록합니다. 여기서 sed는 모든 \ n 문자를 대체합니다.
대안
sed 와 달리 모든 대안 은 프로세스를 시작하기 위해 마지막 줄에 도달 할 필요가 없습니다.
bash 와 함께 , 느리게
while read line; do printf "%s" "$line "; done < file
와 펄 , 나오지도 -like 속도를
perl -p -e 's/\n/ /' file
와 TR ,보다 빠르게 나오지도 하나 개의 문자로 대체 할 수 있습니다 만
tr '\n' ' ' < file
와 붙여 넣기 , 그럴 -like 속도, 하나 개의 문자로 대체 할 수 있습니다 만
paste -s -d ' ' file
와 AWK , 그럴 -like 속도
awk 1 ORS=' ' file
"echo $ (<file)" 와 같은 다른 대안 은 느리고 작은 파일에서만 작동하며 전체 파일을 처리하여 프로세스를 시작해야합니다.
5.10. \ n 이스케이프
시퀀스를 사용하여 줄 바꿈을 일치 시키거나 삭제할 수없는 이유는 무엇 입니까? \ n을 사용하여 두 줄 이상을 일치시킬 수없는 이유는 무엇입니까?
줄이
패턴 공간에 배치되기 전에 줄 바꾸기가 항상 제거 되므로 \ n은 줄 끝에서 줄 바꿈과 일치하지 않습니다 . 패턴 공간에 2 개 이상의 라인을 가져 오려면
'N'명령 또는 이와 유사한 것을 사용 하십시오 (예 : 'H; ...; g;').
Sed는 다음과 같이 작동합니다 .sed는 한 번에 한 줄을 읽고
종료하는 줄 바꿈을 잘라 내고
, sed 스크립트가 처리하거나 변경할 수 있는 패턴 공간에 남은 것을 넣고 패턴 공간
이 인쇄되면 stdout에 줄 바꿈을 추가합니다 (또는 파일). 경우]
패턴 영역이 완전히 또는 부분적으로 'D'또는 'D'로 삭제되면,
줄 바꿈이되어 있지 이러한 경우에 추가. 따라서 스크립트는
sed 's/\n//' file # to delete newlines from each line
sed 's/\n/foo\n/' file # to add a word to the end of each line
줄이 패턴 공간에 들어가기 전에 후행 줄 바꿈이 제거되므로 작동하지 않습니다
. 위 작업을 수행하려면
대신 다음 스크립트 중 하나를 사용하십시오.
tr -d '\n' < file # use tr to delete newlines
sed ':a;N;$!ba;s/\n//g' file # GNU sed to delete newlines
sed 's/$/ foo/' file # add "foo" to end of each line
GNU sed 이외의 sed 버전은
패턴 버퍼 의 크기에 제한이 있으므로 Unix 'tr'유틸리티가 선호됩니다.
파일의 마지막 줄에 줄 바꿈이 포함되어 있으면 GNU sed는
해당 줄 바꿈을 출력에 추가 하지만 다른 줄은
모두 삭제 하지만 tr은 줄 바꾸기를 모두 삭제합니다.
둘 이상의 라인 블록을 일치시키기 위해 3 가지 기본 선택이 있습니다.
(1) 'N'명령을 사용하여 다음 라인을 패턴 공간에 추가하십시오.
(2) 'H'명령을 두 번 이상 사용하여 현재 행
을 보류 공간 에 추가 한 다음
x, g 또는 G 를 사용하여 보류 공간에서 행을 검색하십시오 . 또는 (3) 주소 범위를 사용하여 (
두 섹션 3.3 참조) 지정된 두 주소 사이의 라인을 일치시킵니다.
선택 (1)과 (2)는 \ n을 패턴 공간에 넣고
원하는대로 처리 할 수 있습니다 ( 's / ABC \ nXYZ / alphabet / g').
'N'을 사용하여 행 블록을 삭제하는 한 가지 예 는 4.13 절
( " 특정 연속 행 블록을 어떻게 삭제 합니까?")에 나타납니다. 이
예제는 delete 명령을
'p'(인쇄), 'i'(삽입), 'c'(변경), 'a'(추가)
또는 's'(대체) 와 같은 다른 것으로 변경하여 수정할 수 있습니다. .
선택 (3)는 \ N 패턴 영역에 투입하지 않을 것이다, 그러나 않습니다
당신이하지 않아도 될 수 있도록, 연속 선 블록을 일치
에도 필요한 \ n 당신이 찾고있는 것을 발견합니다. GNU sed
버전 3.02.80 부터 다음 구문을 지원합니다.
sed '/start/,+4d' # to delete "start" plus the next 4 lines,
기존의 '/ here /, / to there / {...}'범위
주소 외에도 \ n을 완전히 사용하지 않는 것이 가능할 수 있습니다.
tr
위의 예는 줄 바꿈을 공백으로 바꿉니다. 위의 예에서 tr은 작동합니다. 그러나 나중에 제한 될 것입니다.