« AppleScriptと一行Perlについて | トップページ | MacBook Pro 13-inch Mid 2010にUbuntu 13.04をインストール »

2013年3月31日 (日)

OS Xのsedで改行を置換する

sed コマンドでの置換において、改行コードを置換の対象にする際は

$ sed -e 's/\n/\r/g'

のような形ではうまくいかず、

$ sed -e ':loop; N; $!b loop; s/\n//g'

のように書かなければならないことがいくつかのサイトに書かれているが、Mac の OS X 上で同じことを行ってもうまくいかない。

もっとも、同じ内容の sed コマンドを別ファイルに

:loop
N
$!b loop
s/\n//g

と書いて、sed_command.txt という名前で保存し、

$ sed -f sed_command.txt

という感じで実行すれば、OS X 上であってもうまくいく。

この点に関して、sed FAQ (英語) の 6.7.1 項を読むと、「GNU sed 以外の sed では、コマンド部分を分けて書かなければならないケースがある」とのこと。特に、「ラベル」(上記の例で言うと「:loop」)が絡む場合、そうなるらしい。

OS X の sed が GNU sed でないことは把握していたので、その項の記述を参考に上記の例を

$ sed -e :loop -e 'N; $!b loop' -e 's/\n//g'

と書き改めてみたところ、見事置換に成功した。


これまでは Apple Script で正規表現置換を行う際、Perl を用いてきたが、この方法を使えば Perl ではなく sed で済ませることも可能になる。例えば、改行コードを LF から CR に変更するには

 set obj_text to do shell script "/bin/echo -n " & quoted form of obj_text & " | sed -e :loop -e 'N;$!b loop' -e 's/\\n/\r/g'" without altering line endings

などと書くことができよう。

なお、この例でもわかる通り、Apple Script 内で sed 置換を行う場合、置換対象になる改行コードは、なぜかエスケープして「\\n」と書く必要があるようだ。


« AppleScriptと一行Perlについて | トップページ | MacBook Pro 13-inch Mid 2010にUbuntu 13.04をインストール »