명령을 사용하여 줄 바꿈 ( ” \n
“)을 공백 ( ” “)으로 바꾸려면 어떻게
sed
해야합니까?
실패했습니다.
sed 's#\n# #g' file
sed 's#^$# #g' file
어떻게 고치나요?
답변
이 솔루션을 GNU와 함께 사용하십시오 sed
.
sed ':a;N;$!ba;s/\n/ /g' file
전체 파일을 루프로 읽은 다음 줄 바꿈을 공백으로 바꿉니다.
설명:
- 를 통해 라벨을 만듭니다
:a
. - 를 통해 현재와 다음 줄을 패턴 공간에 추가합니다
N
. - 우리가 마지막 줄에 이전하는 경우, 생성 된 레이블 분기
$!ba
($!
마지막으로 줄 바꿈이 있어야 수단은 마지막 줄에 그것을 할 수 없습니다). - 마지막으로 대체는 모든 개행을 패턴 공간 (전체 파일)의 공백으로 바꿉니다.
다음은 BSD 및 OS X에서 작동하는 크로스 플랫폼 호환 구문입니다 sed
( @Benjie 설명에 따라 ).
sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' file
보시다시피, sed
그렇지 않으면 간단한 문제에 사용하는 것이 문제가됩니다. 보다 간단하고 적절한 해결책은 이 답변을 참조하십시오 .
답변
sed
라인 기반 입력에 사용됩니다. 필요한 것을 할 수 있지만.
여기서 더 좋은 옵션은 tr
다음과 같이 명령 을 사용하는 것입니다.
tr '\n' ' ' < input_filename
또는 개행 문자를 완전히 제거하십시오.
tr -d '\n' < input.txt > output.txt
또는 긴 버전의 GNU 버전이있는 경우
tr --delete '\n' < input.txt > output.txt
답변
빠른 답변
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)” 와 같은 다른 대안 은 느리고 작은 파일에서만 작동하며 전체 파일을 처리하여 프로세스를 시작해야합니다.
sed FAQ 5.10 의 긴 답변
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을 완전히 사용하지 않는 것이 가능할 수 있습니다.
답변
더 짧은 awk 대안 :
awk 1 ORS=' '
설명
awk 프로그램은 조건부 코드 블록으로 구성된 규칙으로 구성됩니다.
condition { code-block }
코드 블록을 생략하면 기본값이 사용됩니다 { print $0 }
. 따라서 1
는 실제 조건으로 해석되어 print $0
각 라인마다 실행됩니다.
경우 awk
의 값에 기초하여 레코드로 그것을 분할 입력 판독 RS
기본적 개행이다 (기록 분리기), 따라서 awk
것이다 입력 파싱 기본적으로 선 현명한. 분할에는 RS
입력 레코드에서 제거하는 작업도 포함됩니다 .
이제 레코드를 인쇄 할 때 ORS
(Output Record Separator)가 추가되고 기본값은 다시 줄 바꿈입니다. 따라서 ORS
공백으로 변경하면 모든 줄 바꿈이 공백으로 변경됩니다.
답변
gnu sed에는 -z
널로 구분 된 레코드 (행)에 대한 옵션 이 있습니다. 당신은 전화를 할 수 있습니다 :
sed -z 's/\n/ /g'
