80자로 압축된 Markdown 파일이 많이 있습니다. 이를 복사하여 텍스트 영역( )에 붙여넣고 싶지만 xclip -sel clipboard < file
정상적으로 래핑되도록 하고 싶습니다. 단락이 없는 간단 tr "\n" " " < file | xclip -sel clipboard
하지만 모든 텍스트를 연속 단락으로 바꾸려면 여전히 수동으로 복사 편집이 필요합니다.
모든 "\n"을 제거하기 위해 표준 *NIX 도구(GNU 버전이 좋음)를 사용하는 짧은 필터가 있습니까?와는 별개로두 개가 나란히 있을 때? 가급적이면 내가 기억하고 다시 입력할 수 있는 것입니다. 30자 미만이고 문서가 없습니다. sed
뭔가 조치를 취해야 할 것 같은 느낌이 듭니다 .
답변1
당신이 사용할 수있는 perl
:
예를 들어, 다음과 같은 하드 팩 예제 입력 파일을 사용하십시오.
$ cat input.txt
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum.
$ perl -0777 -p -e 's/(?<!\n)\n/ /g' input.txt
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
또는 각 단락 사이에 빈 줄을 원하는 경우:
$ perl -0777 -p -e 's/(?<!\n)\n/ /g; s/\n/\n\n/g' input.txt
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
참고: 입력이 하나 이상의 빈 줄로 끝나지 않는 한 출력의 마지막 줄에는 개행 문자가 없습니다. 필요한 경우 ; END {print "\n"}
스크립트 끝에 추가하세요. 이렇게 하면 출력이 개행 문자로 끝나게 됩니다.
이 -0777
옵션은 Perl에게 입력 파일을 한 번 "후루룩 소리내어" 하나의 긴 문자열로 처리하도록 지시합니다.
위의 한 줄의 코드 버전 모두 "너비 없음 부정 탐색 어설션" - 이라는 Perl 정규식 기능을 사용합니다 (?<!pattern)
. 자세한 내용은 man perlre
"Lookaround Assertions"를 참조하고 검색하세요. 즉, (?<!\n)\n
개행 문자와 일치합니다.~하지 않는 한그 앞의 문자는 또 다른 개행 문자이며 실제로 이전 문자를 일치시키거나 캡처하지 않고 이 작업을 수행합니다(이것이 "너비가 없는 어설션"이 의미하는 것입니다).
부정적인 사후 어설션을 사용하지 않으면 유사한 작업을 수행하고 싶은 유혹을 받을 수 있습니다 s/[^\n]\n/ /g
. 그러나 이렇게 하면 결국 모든 개행 앞에 있는 모든 문자가 제거됩니다... 이것이 바로 정규 표현식의 너비가 0인 부분이 중요한 이유입니다. 이는 이러한 일이 발생하는 것을 방지합니다. . 또 다른 대안은 이와 같은 것을 사용하여 s/([^\n])\n/\1 /g
개행 앞의 문자를 캡처하고 이를 대체에 사용하는 것입니다. 예를 들어 GNU sed를 사용하는 것입니다. sed -E -z 's/([^\n])\n/\1 /g' input.txt
하지만 제 생각에는 앞의 문자를 일치시켜 제거하는 것보다 전혀 일치하지 않는 것이 더 좋습니다. 다시 넣어.
일부 다른 정규식 엔진도 탐색 어설션을 지원하지만 이는 비표준이므로 지원이 보장되지 않습니다.
답변2
tr "\n" " " < file | sed 's/ /\n/g;s/ $//'
잘 작동할 수도 있습니다. 단락 나누기를 다시 추가하려면 단일 간격 문장(일부 사람들이 싫어함)이 필요합니다. 또한 파일의 마지막 줄에 추가된 공간도 잘라냅니다.