나는 파일의 공백을 여백/문자 제약 조건 내에서 하드 래핑하도록 강제하는 간단한 방법을 연구 중입니다. 즉, 어떤 줄도 n 문자보다 길 수 없으며 줄바꿈은 단어 사이에 있습니다. 저는 BBEdit에서 일하고 있습니다:
Find: (.{1,26})(\h+\R?|\R)
Replace: \1\n
하지만 sed(MacOS 12 zsh)에서는 작동하지 않습니다.
내가 얻은 가장 가까운 것은 다음과 같습니다.
sed -i .bak -E 's#(.{1,26})(\h+\R?|\R)#\1\n#g' file.txt
그러나 단어 중간에 줄을 래핑하고 일부 줄을 완전히 놓치므로 제한(이 경우 26줄)을 훨씬 초과하게 됩니다. sed 명령에서 \s \t 및 \n을 시도했지만 아무것도 작동하지 않습니다. 제가 놓친 다른 구문이나 더 적절한 다른 명령이 있습니까? 감사해요.
답변1
어때요?
sed -r 's/(.{1,26}) /\1\n/g' file.txt
무슨 말인지 이해가 안 된다는 점을 인정해야겠습니다 (\h+\R?|\R)
. 뭔가 복잡한 일이 벌어지고 있는 것일 수도 있습니다.
답변2
\h
그리고 \R
그것은 표준이 아닙니다. 나는 \h
그렇게 생각하고 [[:blank:]]
,\R
다음과 같이 설명됩니다. (?>\x0D\x0A|\v)
, 이는 Windows CRLF 개행 문자 또는 모든 수직 공백과 일치합니다. 유니코드에 차이가 있거나 다른 것이 빠진 것이 아니라면 말이죠.
Perl을 사용하여 거의 직접적으로 이 작업을 수행할 수 있습니다.
$ cat file.txt
Perl is a weird programming language that has taken some influences from
sed, among other things.
$ perl -pe 's/(.{1,25})([[:blank:]]+\n?|\n)/$1\n/g' < file.txt
Perl is a weird
programming language that
has taken some influences
from
sed, among other things.
\h
또는 sed를 사용하면 and를 \R
예를 들어 [[:blank:]]
and 로 바꿔야 합니다 \n
. 이것이 \n
작동 하려면 GNU sed가 필요할 수도 있습니다 . 또한 sed가 일치할 수 있도록 버퍼에 후행 줄 바꿈을 포함시키려면 -z
GNU sed가 NUL로 구분된 "줄"을 고려하여 \n
일반 문자를 형성하도록 하는 옵션이 필요합니다. 패턴을 have 로 수정할 수도 있지만 (...|\n|$)
, 그러면 파일에 이미 있는 줄 바꿈 앞에 줄 바꿈을 추가하게 됩니다.
$ sed -z -E 's#(.{1,40})([[:blank:]]+\n?|\n)#\1\n#g' < file.txt
Perl is a weird programming language
that has taken some influences from
sed,
among other things.
위에 표시된 것처럼 정규 표현식은 위에 표시된 대로 기존 개행 문자를 제거하지 않습니다.