줄바꿈을 강제하기 위해 BBEdit에서 sed로 정규식을 변환하는 중에 문제가 발생했습니다.

줄바꿈을 강제하기 위해 BBEdit에서 sed로 정규식을 변환하는 중에 문제가 발생했습니다.

나는 파일의 공백을 여백/문자 제약 조건 내에서 하드 래핑하도록 강제하는 간단한 방법을 연구 중입니다. 즉, 어떤 줄도 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가 일치할 수 있도록 버퍼에 후행 줄 바꿈을 포함시키려면 -zGNU 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.

위에 표시된 것처럼 정규 표현식은 위에 표시된 대로 기존 개행 문자를 제거하지 않습니다.

관련 정보