
私は、ファイルのスペースを余白/文字制約内でハードラップするように強制する簡単な方法を研究しています。つまり、どの行も 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をたとえば\R
and[[:blank:]]
に置き換える必要があります\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.
上記のように、正規表現は上記のように既存の改行文字を削除しません。