改行を強制するために、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改行文字またはすべての垂直スペースに一致します。 Unicodeに違いがあるか、他のものが欠けていない場合はそうです。

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をたとえば\Rand[[:blank:]]に置き換える必要があります\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.

上記のように、正規表現は上記のように既存の改行文字を削除しません。

関連情報