[sed] macOSでもLinuxでもsedを使ってtab文字を置換する
要約
ASCIIコードを用いることで、macOSでもLinuxでも同じ書き方でtab文字を置換できるようになります。
TAB="$(printf '\\\011')"
printf "hoge\tfuga\n" | sed "s/${TAB}/,/g"
sed
のOS依存 (BSD sed vs GNU sed)
sed
の使用例として、タブ区切りをコンマ区切りにする下記のスクリプトをよく用いていました。
# Linux
$ printf "foo\tbar\n"
foo bar
$ printf "foo\tbar\n" | sed "s/\t/,/g"
foo,bar
しかしの方法ではmacOSではうまく置換できません。
# macOS
$ printf "foo\tbar\n"
foo bar
$ printf "foo\tbar\n" | sed "s/\t/,/g"
foo bar # <-変わっていない!
どうやらこの違いはmacOSはBSD sed
で、LinuxはGNU sed
を使用していることに起因するようです。
BSD sed
でタブ文字置換をどうするかついて、過去のQiita記事にございました
(同じタイトルですが、違う記事です)
しかし上記事の方法は使用状況が限られるため、もう少し汎用性を持ちたいと思っていたところ、次の記事がございました。
上記事では以下のようにASCIIコードを使ってLF(改行)を表現していました。
LF=$(printf '\\\012_')
LF=${LF%_}
echo "hogehoge\nfoo\nbar" | sed 's/\\n/'"$LF"'/g'
この方法はそのままタブ文字に応用できるのでは、と思って検証したところ、無事に動作しました。
# ASCIIコードで水平タブ(HT)は011です
TAB="$(printf '\\\011')"
printf "hoge\tfuga\n" | sed "s/${TAB}/,/g"
これでmacOSでもLinuxでも、同じ書き方でtab文字を置換できるようになりました。
検証環境
# macOS
- OS: Catalina 10.15.6 19G2021 x86_64
- Kernel: 19.6.0
- Shell: zsh 5.7.1
# Linux
- OS: Linux Mint 20 x86_64
- kernel: 5.4.0-47-generic
- shell: bash 5.0.17
Author And Source
この問題について([sed] macOSでもLinuxでもsedを使ってtab文字を置換する), 我々は、より多くの情報をここで見つけました https://qiita.com/tori_taro/items/7fa8a34c1bd94d89ac28著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .