tr을 사용하여 텍스트 서식을 지정하는 중에 문제가 발생했습니다.

tr을 사용하여 텍스트 서식을 지정하는 중에 문제가 발생했습니다.

다음 형식의 텍스트가 포함된 파일이 있습니다.

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 이전 빈 행 이후에 수집한 행입니다. 여기서 추가 빈 줄은 더 많은 추가 빈 줄을 생성합니다.xs/\n//gs/$/\n/

답변2

이 sed 명령을 사용할 수 있습니다

sed '/,/{N;s/\n//;s/$//;}' myfile.txt

관련 정보