두 개의 연속 CR을 하나로 대체

두 개의 연속 CR을 하나로 대체

cat -e file.txt다음을 제공합니다:

{"yellow":"mango"}^M$
^M$
{"yellow":"banana"}^M$
^M$
{"yellow":"blabla"}^M$
^M$

그리고 나는 다음을 갖고 싶습니다:

{""yellow":"mango"}^M$
{"yellow":"banana"}^M$
{"yellow":"blabla"}^M$

폴더에 txt 확장자가 있는 모든 파일에 적용됩니다. 그래서 나는 다음을 시도했습니다.

find . -type f -name "*.txt" -print0 | xargs -0 sed -i "s/^M$^M$/^M$/g"

소용이 없습니다. 누구든지 더 좋은 생각이 있나요?

head -n 3 file.txt | od -bc

수익률:

0000000 173 042 171 145 154 154 157 167 042 072 042 155 141 156 147 157
          {   "   y   e   l   l   o   w   "   :   "   m   a   n   g   o
0000020 042 175 015 012 015 012 173 042 142 141 142 141 142 042 072 042
          "   }  \r  \n  \r  \n   {   "   b   a   b   a   b   "   :   "
0000040 155 141 156 147 157 042 175 015 012
          m   a   n   g   o   "   }  \r  \n
0000051

이것:

awk 1 RS='\r\n' ORS= < file.txt

새 줄을 완전히 제거합니다(그래서 좋지 않습니다. 각 줄에 연속된 두 줄 중 하나를 유지하고 싶지만 뭔가 작동합니다).

답변1

당신이 사용할 수있는 sed -z 's/\r\n\r\n/\r\n/g'.

일반적으로 sed한 번에 한 줄에서만 작동합니다. 이 -z옵션을 사용하면 일반적으로 텍스트 파일에 존재하지 않는 바이트 sed로 구분된 줄에서 작동하므로 0전체 파일이 한 줄로 처리되고 줄 바꿈이 바뀔 수 있습니다.

(에서 발견됨스택 오버플로그리고 설명 추가)

답변2

캐리지 리턴만 포함된 줄을 삭제할 수도 있습니다.

  • GNU Sed를 사용하면:

    sed '/^\r$/d' file
    
  • 최소한이지만 POSIX 호환 시스템의 경우(여기서는 Printf를 사용하여 캐리지 리턴을 생성해야 함):

    sed "/^$(printf "\r")$/d" file
    

^줄 시작 및 마지막 $, 줄 끝( \n)과 일치합니다.

예를 들어:

$ cat -e file
AB^M$
^M$
CB^M$
^M$
$ sed '/^\r$/d' file|cat -e
AB^M$
CB^M$

답변3

빈 줄을 모두 제거해도 괜찮다면 다음을 수행할 수 있습니다.

perl -wlne '/\S/ and print' old_file > new_file

파일을 덮어쓰려면 -i(in-place) 스위치를 사용하면 됩니다.

perl -wlni.bak -e '/\S/ and print' file1 file2 file3 ...

위 줄은 원본 파일을 *.bak파일로 복사합니다. 백업에 관심이 없다면 .bak다음과 같이 해당 부분을 생략할 수 있습니다.

perl -wlni -e '/\S/ and print' file1 file2 file3 ...

(와일드카드를 사용할 수도 있으므로 대신 file1 file2 file3 .... file*)

이 접근 방식의 장점은 파일을 한 번에 변경한다는 것입니다(각 파일에 대해 한 번 실행하지 않고).

하지만 기억하세요. 이렇게 하면 공백이 아닌 문자가 하나 이상 포함된 줄만 유지됩니다. 따라서 줄이 5개의 공백, 탭, 캐리지 리턴 및 줄 바꿈 문자로만 구성된 경우 유지되지 않습니다.

답변4

Raku(이전에는 Perl6으로 알려졌던 언어) 사용

~$ raku -ne '.put if /\S/ ;' test_blank.txt
{"yellow":"mango"}
{"yellow":"banana"}
{"yellow":"blabla"}

위의 예는 공백이 아닌 문자( \S공백이 아닌 단일 문자와 일치)가 포함된 행만 인쇄합니다. 아래는 매우 읽기 쉬운 버전입니다.

~$ raku -ne '.put if .chars;' test_blank.txt
{"yellow":"mango"}
{"yellow":"banana"}
{"yellow":"blabla"}

HTH.

https://raku.org
https://rakudo.org/downloads

관련 정보