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

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//’“$LF”’{{% googleadsense %}}/g | safeHTML }}

参考

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

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

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

スポンサーリンク