0

改行に置換するためのワンライナー集(tr/sed/perl) 、あとmac標準のsedはposix準拠なのでgnu準拠のsedを使いましょう!

ある文字を改行「に」置換する方法を紹介します。

$PATHの中身が長くて見にいので、”:”を改行に置換してみやすくする

$ echo $PATH
/Users/DQNEO/.rbenv/bin:/Users/DQNEO/.rbenv/shims:/Users/DQNEO/.plenv/bin:/Users/DQNEO/.plenv/shims:/usr/local/opt/coreutils/libexec/gnubin:/usr/local/bin:/Users/DQNEO/bin:/usr/bin:/bin:/usr/sbin:/sbin

横に長いので、改行で区切りたい!

①trで置換

こういう場合は、trコマンドを使うのが一番簡単です。

$ echo $PATH | tr ':' '\n'
/Users/DQNEO/.rbenv/bin
/Users/DQNEO/.rbenv/shims
/Users/DQNEO/.plenv/bin
/Users/DQNEO/.plenv/shims
/usr/local/opt/coreutils/libexec/gnubin
/usr/local/bin
/Users/DQNEO/bin
/usr/bin
/bin
/usr/sbin
/sbin

②Perlで置換

PerlならMac / Linux などOS関係なく同じ挙動なので安心です。

$ echo $PATH | perl -pe 's/:/\n/g'

③sedで置換

$ echo $PATH | sed 's/:/\n/g'

注意
MacOSX のsedの場合、これでは動きません。
GNU sed(gsed)を使いましょう。

つまるところ、

brew installしてalias sed=”gsed”しておきましょう。


brew パッケージは gnu-sed になります。

$ which sed
/usr/bin/sed ←★ OSX に入っているの sed は BSD 由来の POSIX sed 
which gsed
/usr/local/bin/gsed ←★ GNU sedは GNU 拡張。

POSIX 準拠のバイナリよりも便利になっていて、
例えば -i (–in-place) というオプションがある
これは、ファイルを開いて置換して保存するという機能を実現するコマンドなのだけれど、
MacOSX だとこのオプションは使えない。

ディレクトリ配下にある大量の .txt ファイルを開き、
hoge という文字を fuga に置換したいとき

POSIX sed の場合

for i in *.txt; do cat $i | sed "s/hoge/fuga/g" > $i.new; mv $i.new $i; done

GNU sed の場合

sed -i "s/hoge/fuga/g" *.txt

また、シェルのパイプ “|” やリダイレクト “>” を使うと
入力ファイルから直接出力ファイルに書き込むことが出来ない。
以下のコマンドは正しく動作しない。

cat fuck.txt | sed "s/hoge/fuga/g" > fuck.txt

一旦別のファイルに落とすのが定石なのだけれど、
そうするとファイルを mv するコマンドが入る。

cat fuck.txt | sed "s/hoge/fuga/g" > fuck.txt.new
mv fuck.txt.new fuck.txt

fm. . .コマンドが非常に煩雑ですね。。

以上のとおり、

POSIX準拠 sed より、GNU sed は 便利!

以上です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です