Help us understand the problem. What is going on with this article?

Macのsedで改行コードを出力させる 〜改行コードの違い再確認〜

More than 5 years have passed since last update.

Octpressで各ブログ記事に利用していた<!--more-->を一括置換するときに、ハマった話。

以下のように、<!--more-->を置換しようとしたのが、

  • !のエスケープ
  • 改行コードの出力

でハマった。

置換前

<!--more-->

置換後

<!--more-->
{% include hogehoge.html %}

!のエスケープ

まず、!は過去の実行コマンドを参照するコマンドのため、置換文字列に含まれると意図しない動きをしてしまう。

⇛ \! とエスケープすることで解決

改行コードの出力

Macのsedコマンドでは、例えば、以下のように\nを改行コードに置換しようと思っても、全然意図する動きにならない。

echo "hogehoge\nfoo\nbar" | sed 's/\\n/\n/g'

正しく置換させるためには、以下のようにする必要があるとのこと。

LF=$'\\\x0A'
echo "hogehoge\nfoo\nbar" | sed 's/\\n/'"$LF"'/g'

CR LF CR+LFの違い

改行コードの復習も兼ねて調べておく

キャリッジリターン(Carriage Return 復帰 : CR(0x0d))

  • 行頭へ印字ヘッドあるいはカーソルを移動すること。

OS9までのMacOSは、CRを改行コードと解釈していた(裏取りなし)

ラインフィード(Line Feed 改行 LF(0x0a))

  • 次の行へ一行移動する。

UNIX環境は、LFを改行コードと解釈する
(OSXも同様)

CRLF 0x0d0a

Windows環境は、CR LFを改行コードとして解釈する

実行したかったコマンド

markdownファイルの中の、<!--more-->タグを置換する

find . -name "*.markdown" | xargs sed -i '' 's/<\!--more-->/<\!--more-->'"$LF"'{% include ga.html %}/g'

参考

sedで改行を出力する - rcmdnk’s blog

図解DTP用語辞典
改行コードの違い 日本語組版でいう改行は、行を改めて次の行の初めから文字を組み始めることである。しかし欧文組版では、タイプライターの操作メカニズムの制約から日本語の改行に当たる操作は2段階に分かれ、 ...

改行コードの違いを体感してみる - ザリガニが見ていた...。

メモ

find _posts/ -name "*.markdown" | xargs grep "ga.html"
_posts//2014-09-28-baseball-club-yokyo.markdown:{% include ga.html %}
_posts//2014-10-30-how-google-works.markdown:{% include ga.html%}
_posts//2014-11-16-fountain-pen-cleaning.markdown:{% include ga.html %}
_posts//2014-11-21-ted-api.markdown:{% include ga.html %}

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away