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

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

更新日:2019.05.01 作成日:2014.11.25

Octpressで各ブログ記事に利用していた`

`を一括置換するときに、ハマった話。

以下のように、<!--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 }}

参考

Related contents