PDF から段落をコピーして別の場所に貼ると、いくつもの短い行に分断されて届きます。リストを貼れば半分の行が重複している。これは最もよくある、そして最も面倒なテキスト作業の 1 つです。ここでは、それぞれの乱れをどう直すか、そして内部で何が起きているのかを説明します。
PDF から実際にコピーした文字列を、整えると。 テキストクリーナーに、典型的な乱れを与えました ——
This sentence was/copied out of a/PDF./ 空行 2 つ /It has broken lines.。そして「空白を詰める」と「空行を削除」にチェックを入れました。結果は行の構造を保ちつつ空白を直します。This sentence wasが 1 行になり、空行は消えます。貼る前に知っておくとよいこと:何もチェックしなければ、このツールは意図的に何も変えません。 チェックボックス 1 つが変換 1 つなので、何が起きるかを正確に選べます。中身の見えない「クリーン」ボタン 1 つで、望んでいない変更まで受けることはありません。
入力と出力を、そのまま。 PDF から貼った典型的な文字列をテキストクリーナーに通し、「空白を詰める」と「空行を削除」を有効にしました。
This sentence was copied out of a PDF. It has broken lines.が、こうなります。
This sentence was copied out of a PDF. It has broken lines.連続する空白と空行は消え、行の構造は残ります。そして何もチェックしなければ、このツールは意図的に何も変えません。チェックボックス 1 つが変換 1 つなので、頼んでいない副作用は起きません。
改行の除去(段落を元に戻す)
PDF やメールは、1 つの段落を多数の独立した行として保存し、各行末に硬い改行を入れていることがよくあります。普通のエディタに貼っても、分断されたままです。直すには、行をもう一度つなぎ合わせます:
- 空白でつなぐ——最も一般的:
1 行目⏎2 行目が1 行目 2 行目になります。文章向き。 - そのまま連結(間を空けない)——途中で切られ、続けてつながるべきデータ向き。
ポイントは、「改行」が実在する文字である(場合によっては 2 つ:復帰 + 改行)と理解することです。除去とは、その文字を置き換えるだけのことです。
比較やコミットの前に折り返しを整える、測れる理由があります。同じ 3 語をテキスト差分ツールに 2 回入力しました。1 回は 1 行、もう 1 回は 3 行、ほかは何も変えていません:
−
one two three
+
one
+
two
+
three
すべての行が「変更」の印付きで返りました。行単位のツールにとって改行は内容そのものです。だから PDF からハード改行付きでコピーした段落は、diff でも重複チェックでもデータベース比較でも、折り返しを直した双子と決して一致しません。
重複行の削除
リスト——メールアドレス、キーワード、URL——にはすぐ重複が紛れ込みます。削除では各行の最初の出現を残し、その後の重複をすべて落とすため、元の順序が保たれます。順序が重要でなければ、後で A→Z に並べ替えると、同じ項目が隣り合います。
行単位のツールにとって、重複行の削除は最も安い編集です。私たちのテキスト差分ツールがその理由を見せてくれます。3 行から 1 行を削ると返るのは
alpha
−
beta
gamma
戻して足すと返るのは
alpha
+
beta
gamma
それぞれ印付きの行は 1 つだけで、触っていない行は無印のままです。上の折り返しの例と比べてください。あちらは全行に印が付きました。重複除去は diff の前に安全に実行できる操作です。折り返しの変更は、両側に同じ処理をしない限りそうではありません。
空行と余分な空白の削除
もう 2 つの定番:
- 空行——段落の間に残る空の行。削除すると文章が締まります。
- 余分な空白——連続した空白や、タブが空白の連なりになったもの。連続を 1 つの空白に統合すると、体裁が揃います。
実際に貼った文字列で計測しました。これをテキストクリーナーに入れ、「空白を詰める」と「空行を削除」を有効にしました。
This sentence was
copied out of a
PDF.
It has broken lines.
返ってきたのは:
This sentence was
copied out of a
PDF.
It has broken lines.
連続する空白と空行は消え、行の構造は残ります。そして何もチェックしなければ入力をそのまま返します。チェックボックス 1 つが変換 1 つだからです。
すべて一度に、プライバシーを守って
手作業で置換を繰り返す必要はありません。テキストクリーナーが合理的な順序で適用します——各行を trim、空白を統合、空行を削除、重複を削除、並べ替え、最後に選択に応じて改行を結合——結果はリアルタイム表示。すべてブラウザ内で処理され、機微なテキストもアップロードされません。
操作が 1 つの「クリーン」ボタンではなく別々になっているのもそのためです。空白を詰めずに空行だけ消すこともでき、行数を変えずに空白だけ詰めることもできます。ボタン 1 つでは、どちらが欲しいのか推測するしかありません。
CR・LF・CRLF:三種類の「改行」
あの見えない改行は、いつも同じ文字とは限りません。三種類あり、それぞれ由来する OS が違います:
- LF(
\n、line feed)——Linux・macOS・Unix が使用。 - CRLF(
\r\n、復帰 + 改行)——Windows の慣習。 - CR(
\r、単独)——OS X 以前の古い Mac OS。今ではまれ。
ふだんは気づきません。しかしテキストが OS をまたぐと、行末の不一致が実害を生みます:diff で「全行が変わった」ように見えたり、シェルスクリプトが謎のエラーで落ちたり、全体が一本の長い行になって、ときに ^M が見えたりします。行末を統一すれば、これらは一度に片づきます。
同じ仕組みが CR と LF も説明します。行単位のツールが比較するのは各行末のバイトなので、改行の方式を変えるだけでファイルは全面的に書き換えられたように見えます。目に見える文字は 1 つも動いていないのに。上の「折り返しだけで全行に印」とまったく同じ形です:
−
one two three
+
one
+
two
+
three
だから「改行コードの統一」は本当の変更とは別のコミットにすべきで、レビュアーもそう求めます。
ソフトラップは改行ではない
よくある勘違い:エディタが長い行を画面幅に合わせて折り返すのはソフトラップ——見た目だけで、裏に文字はありません。ハード改行こそ削除できる実在の文字です。改行の除去が触れるのはハード改行だけで、ソフトラップは勝手に折り返すので消すものがありません。
こんなときに
- リスト——メール・キーワード・URL——を、取り込み用に 1 行 1 件へ整える。
- 貼るとバラバラに届くフォームやチャットに、段落をそのまま貼りたいとき。
- 再利用の前に、メール署名や引用文をきれいにする。
行末の不一致は、ほぼ同じ 2 つのファイルが並べると全く違って見える原因でもあります——2 つのテキストを比較する方法で、ノイズを越えて本当の変更を見る方法を紹介しています。