Mac
sed

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

More than 3 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 %}