記事の末尾を一括で差し替えたら直前の本文まで消えるとき|エディタは行ではなく段落単位で置き換える仕組みと、検証を「元原稿の全行が残っているか」で行う手順
記事の末尾を一括で差し替えたら直前の本文まで消えるとき|エディタは行ではなく段落単位で置き換える仕組みと、検証を「元原稿の全行が残っているか」で行う手順
記事の最後に置いている「関連リンク」「お問い合わせ先」「サービス紹介の一文」を、何十本もまとめて新しい文面に差し替える作業は、店舗ブログやnoteを運用していると必ず発生します。サービス名が変わった、LINEの登録先を替えた、キャンペーンが終わった、といった理由です。
先に結論を書きます。
- エディタの多くは文章を「行」ではなく「段落(ブロック)」単位で持っています。 Enterで改行した行は別の段落、Shift+Enter(または原稿の単一改行)でつないだ行は同じ段落の中に入ります
- そのため「末尾の段落を選んで置き換える」操作は、同じ段落に同居していた直前の本文まで一緒に消します
- 防ぐには、①差し替える部分を投入前に独立した段落にしておく、②置換は段落ごとではなく対象の文字列だけを削る、③検証は元原稿の全行が残っているかで行う、の3点が必要です
- 「本文が何文字減ったか」「末尾の文字列が正しいか」だけの検証では、欠落が短い記事を見逃します
以下、なぜ消えるのか、実際にどういう規模で起こりうるのか、安全に差し替える手順の順で説明します。
なぜ直前の本文まで消えるのか:エディタは「段落」で文章を持っている
見た目は1行ずつ並んでいても、エディタの内部ではまとまりが違います。
| 入力のしかた | 内部での持ち方(HTMLのイメージ) | 見た目 |
|---|---|---|
| Enterで改行 | <p>本文の最後の行</p><p>▶ 関連リンク</p> |
段落が分かれ、行間がやや空く |
| Shift+Enterで改行 | <p>本文の最後の行<br>▶ 関連リンク</p> |
同じ段落の中で行だけ変わる |
noteのエディタ、WordPressのブロックエディタ、Googleドキュメントなど、多くのエディタで「Enter=新しい段落」「Shift+Enter=段落内の改行」という区別があります。画面上では2つの差がわずかな行間の違いでしか見えないため、人の目ではほぼ気づけません。
問題になるのは、自動投入ツールや一括処理で原稿を流し込んだ場合です。Markdownなどの原稿で空行を挟まず、単一の改行だけで続けて書いた行は、投入時に「段落内の改行」として扱われることがあります。すると、最後の見出しの本文と、末尾のリンク行が、同じ1つの段落に入ります。
この状態で「末尾の段落を丸ごと選択して、新しい文面を入力する」という置換をかけると、段落ごと置き換わるので、同居していた本文(最後の見出しの直下の数行)も消えます。 置換ツールは「▶で始まる行」を狙ったつもりでも、エディタが扱える単位は段落なので、指定した行だけを抜き出して消すことはできません。
実例:末尾リンクを30本まとめて差し替えるケース
当社で自社メディアの下書き30本の末尾を「一言+リンク4行」に差し替える作業を行った際、この構造がそのまま問題になりうることを確認しています。条件は次のとおりです。
- 対象:note上の下書き30本
- 作業:末尾の「▶ サービス紹介」1行を、一言コメントとリンク4行に差し替える
- 方法:自動操作で末尾の段落を選択し、新しい文面を入力する
- 原稿:最後の見出しの本文と「▶」行の間に空行がなく、単一の改行で続いていた
この条件がそろうと、30本すべてで、最後の見出しの直下にある本文2〜7行が差し替えと一緒に消えることになります。原稿の書き方が全記事で共通なので、欠落も全記事に同じ形で出ます。一括処理の怖さは、1本で起きることが全件で起きる点です。
さらに見落としやすいのが検証の側です。「差し替え後に本文が80文字以上減っていたら異常」という判定を置いていても、消えた本文が短い記事ではこの基準をすり抜けます。今回の条件では、30本中8本が減り幅の判定を通過してしまう計算でした。末尾の文字列が新しい文面になっているかも確認していましたが、末尾は正しく差し替わっているので、ここでも異常は出ません。
1本目を目視で確認するときも、画面の最下部だけを見ると「リンクが新しくなっている」ことしか分かりません。最後の見出しの本文が消えていることは、見出しから下を通して見ないと気づけない種類の欠落です。
安全に末尾を差し替える手順
手順1:差し替え前に元原稿を保存する
一括で本文を書き換える前に、全記事の元原稿をファイルで残します。 後の検証も復元も、この元原稿が基準になります。エディタの版履歴に頼ると、記事ごとに画面を開いて戻す手作業になり、30本規模では現実的ではありません。バックアップの考え方は「ホームページのバックアップは何をどこまで取れば足りるか」でも整理しています。
手順2:差し替える部分を独立した段落にしておく
原稿の段階で、末尾のリンク行の前に必ず空行を入れます。 これで投入時に別の段落として扱われ、末尾の段落を置き換えても本文は巻き込まれません。今後の記事のテンプレートにも空行を入れておけば、次回の差し替えで同じ問題は起きません。
すでに投入済みの記事で、末尾が本文と同じ段落に入っているかどうかは見た目では判断できないため、手順4の構造確認で調べます。
手順3:置換は「段落ごと」ではなく「対象の文字列だけ」
自動操作で差し替えるときは、段落を丸ごと選択して上書きするのをやめ、次のどちらかにします。
- 段落の末尾にカーソルを置き、差し替える文字列の文字数ぶんだけ削除してから新しい文面を入れる
- 段落ごと置き換える場合は、置換前にその段落の中身を読み取り、差し替え対象以外の行を新しい文面の前に書き戻す
どちらの方法でも、「消してよいのは差し替え対象の文字列だけ」という前提をツール側に持たせることが大事です。
手順4:1本目は構造まで確認する
最初の1本を処理したら、画面のスクリーンショットではなく、エディタ内の段落の一覧(タグの種類と中身)を書き出して確認します。見出し・段落・リンクがどの単位で並んでいるかを見れば、末尾が本文と同居していないか、置換後に本文の段落が減っていないかが分かります。見た目の確認は最下部だけで終わらせず、最後の見出しから下を通して見ます。
手順5:検証は「元原稿の全行が残っているか」で行う
差し替え後の検証は、次の3つを全記事に対して機械的に行います。
- 元原稿の本文の各行が、差し替え後の本文にすべて存在するか(差し替え対象の行だけは除外する)
- 見出し(h2)の数が元原稿と一致するか
- 末尾に新しい文面の要素(一言・リンク4本など)がすべてそろっているか
1が最も重要です。文字数の増減や末尾の照合は「差し替えが行われたか」は確かめられても、「差し替え以外が壊れていないか」は確かめられません。確認の考え方をコードにすると、次のような単純なものです。
def missing_lines(original: str, edited: str, skip_prefix: str = "▶") -> list[str]:
edited_text = edited.replace("\n", "")
missing = []
for line in original.splitlines():
line = line.strip()
if not line or line.startswith(skip_prefix):
continue
if line not in edited_text:
missing.append(line)
return missing
欠落が1行でもあれば異常として止め、どの記事のどの行が消えたかを一覧で出します。取り込み後に件数や金額を元データと突き合わせる考え方は「売上データを取り込んだら金額が合わないときの原因」と同じです。「成功」と表示されたことではなく、元データと突き合わせた結果で完了を判断します。
また、保存ボタンを押した直後の画面ではなく、記事を開き直した状態で検証することも必要です。保存が反映されていない状態を「正しく差し替わった」と誤認しないためで、詳しくは「自動投稿で「保存完了」と出たのに中身が空になるとき」で解説しています。
本文が消えてしまったときの戻し方
手順1で元原稿を残していれば、復元も機械的に行えます。
- 手順5の検証を全記事にかけ、記事ごとに欠落した行を一覧にする
- 末尾の段落(差し替え後の文面が入っている段落)を、「欠落した本文+新しい末尾の文面」で置き換える
- 置き換えた記事を開き直し、もう一度手順5の3項目で検証する
ここで大事なのは、復元作業そのものも同じ検証を通すことです。戻す作業で別の行を消していないかを確かめて、初めて完了とします。
一括差し替えの前に確認するチェックリスト
| 確認項目 | 確認する理由 |
|---|---|
| 全記事の元原稿をファイルで保存したか | 検証と復元の基準になる |
| 差し替え対象の行の前に空行があるか | 本文と同じ段落に入るのを防ぐ |
| 置換が段落単位ではなく文字列単位になっているか | 同居している行の巻き込みを防ぐ |
| 1本目で段落の構造まで確認したか | 画面の最下部だけでは欠落が見えない |
| 検証が「元原稿の全行が残っているか」を含むか | 減り幅や末尾照合では短い欠落を見逃す |
| 開き直した状態で検証しているか | 保存されていない状態を成功と誤認しない |
似た落とし穴として、Keynoteなどの資料で文字を一括置換すると、狙っていない箇所まで書き換わることがあります。置換の対象範囲をどう絞るかは「Keynoteの資料でサービス名を全ページ一括置換する方法」で扱っています。
まとめ
- エディタは文章を「行」ではなく「段落」で持つため、末尾の段落を置き換えると、同じ段落に入っていた直前の本文も消える
- 原稿で空行を挟まずに続けた行は、投入時に同じ段落へ入ることがある。差し替える部分の前には必ず空行を入れる
- 置換は段落ごとではなく対象の文字列だけを削る。段落ごと置き換えるなら、対象以外の行を書き戻す
- 検証は「元原稿の全行が残っているか」「見出し数」「新しい末尾の要素」の3点を、開き直した状態で全記事に行う
- 元原稿を残しておけば、欠落した行の抽出から復元まで機械的に戻せる
記事の末尾の差し替えは、作業としては数分で終わる単純なものに見えます。しかし一括処理では、1本で起きる欠落が全記事に同じ形で広がります。差し替えそのものより、差し替え以外が壊れていないことを確かめる仕組みを先に用意しておくのが、運用を止めないためのいちばん確実な方法です。