다음 형식의 텍스트가 포함된 파일이 있습니다.
line 1,
line 2,
< Blank line >
line 3,
line 4,
< Blank line >
line 5,
line 4,
< Blank line >
다음 형식으로 설정해야 합니다.
line 1,line 2,
< Blank line >
line 3,line 4,
< Blank line >
line 5,line 4,
< Blank line >
그래서 나는 노력하고 있습니다 :
tr -d '\n' < myfile.txt > myfile_res.txt
하지만 그런 다음 모든 것을 연결합니다.
line 1,line 2,line 3,line 4,line 5,line 4
나에게 필요한 것은 문자가 포함된 줄에서만 '\n'을 제거하고 빈 줄을 유지하는 것입니다. 작동할 것이라고 믿습니다.
코딩하는 방법을 알고 있나요?
답변1
tr
한 번에 한 문자만 보기 때문에 컨텍스트를 확인해야 할 때는 실제로 작동하지 않습니다.
섹션은 빈 줄로 구분되므로 단락 모드는 다음 awk
과 같은 경우에 적합합니다.
awk -vRS= '{gsub(/\n/, ""); print $0 "\n"}' myfile.txt
빈 줄로 구분된 빈 로드 "레코드"를 설정하면 RS
각 레코드에 대해 다시 줄바꿈을 제거한 다음 추가 줄바꿈을 사용하여 레코드를 인쇄합니다.
Perl에서도 비슷하지만 Perl이 다른 문자처럼 마지막 개행 문자를 로드하기 때문에 두 개의 추가 개행 문자가 있습니다.
perl -00ne 's/\n//g; print "$_\n\n"' myfile.txt
둘 다 여러 개의 빈 줄을 하나의 빈 줄로 처리합니다.
sed를 사용하여 이 작업을 수행할 수 있지만 두 줄 이상의 블록을 지원해야 하는 경우 초기 시도보다 조금 더 복잡합니다.
sed -n 'H; $bL; /./d; :L; x; s/\n//g; s/$/\n/; p;' myfile.txt
현재 라인을 보유 버퍼( H
)에 추가한 다음 이것이 마지막 라인( )인지 확인하고 $
, 이 경우 L( bL
)로 분기합니다. 없으면 ( ) 문자가 있는지 확인하고 /./
, 있으면 ( d
) 줄을 삭제하고 처음으로 돌아갑니다.
그렇지 않으면(라인이 비어 있음) 입력 시 버퍼와 현재 라인(패턴 공간)을 L
교환하고 ( ) 개행을 제거하고( ) 끝에 또 다른 개행을 추가하고( ) 암시적으로 패턴 공간을 인쇄합니다. self 이전 빈 행 이후에 수집한 행입니다. 여기서 추가 빈 줄은 더 많은 추가 빈 줄을 생성합니다.x
s/\n//g
s/$/\n/
답변2
이 sed 명령을 사용할 수 있습니다
sed '/,/{N;s/\n//;s/$//;}' myfile.txt