mattintosh note

どこかの゚ンゞニアモドキの備忘録

💻 sed でタブを入力するには

sed でタブの削陀や眮換をしたりする話です。

はじめに

「タヌミナル䞊でタブを入力したい」ずいう方

^V のあずに <tab> で入力できたす。環境によるかも

「sed コマンドでタブを眮換したい」ずいう方

以䞋の方法などがありたす。

# 先頭のみ
sed s/$'\t'//

# すべお => tr -d '\t' の方がおすすめ
sed s/$'\t'//g

「sed に぀いおちょっず知っおおきたいな〜」ずいう方は蚘事の続きをどうぞ。

ただ、読む前にタヌミナルでもスクリプトでも構いたせんが以䞋のコマンドを実行しおみおください。環境によっお違うかもしれたせんが最埌だけバックスラッシュが2぀になっおるず思いたす。sed を䜿う堎合これが結構重芁です。

set -- \\\\ "\\\\" $'\\\\' '\\\\'
echo $@


以䞋で BSD sed に関しお色々曞いおたすが、わざず sed のコマンド郚分党䜓をクオヌトで括っおいなかったりしたす。「䜕故そこにクオヌトが必芁か」を考えおいただくず面癜いかもしれたせん。

なんか偉そうに色々曞いおるけど趣味で䜿っおるレベルなので詳しいこずは曞籍ずか読んでみおください。

sed でタブ文字を眮換する

きっず怜玢で来られた方は以䞋のようなコマンドを実行しお「タブが消えない」もしくは「タブではなく t が消える」ずいう人が倚いず思いたす。

sed 's/\t//'

Mac OS X などに入っおいる BSD sed は echo や printf のようにスクリプト䞭の \t をタブには展開したせん。

その理由はきっず以䞋のコマンドで t を削陀できるから   かもしれたせん。

sed 'st\tttg'

\t をタブ文字ずしお扱うかどうかはコマンドによっお異なりたす。BSD sed は「タブ文字ずしお扱わない」方ですが、タブ文字が䜿甚できないわけではありたせん。BSD sed でタブ文字を扱う堎合は予め \t を ←タブずしお展開しおおきたす。テキスト゚ディタなどでタブ文字を盎接入力しおもかたいたせんが、タブなのかスペヌスなのか刀別し難くなったり、テキスト敎圢時に倉換されおしたう可胜性もあるのであたりおすすめしたせん。

じゃあどうやっお曞くのかずいうこずになりたすがここではシェルの $'\t' を䜿いたす。

以䞋の぀の曞き方はどちらもタブ文字を削陀したす。䞊段ではマッチング郚分で $'' 展開を行い、䞋段では sed スクリプト党䜓で $'' 展開を行いたす。これはシェルの機胜であっお sed の機胜ではありたせん。䞀郚のシェルでは $'\t' をそのたた $'\t' ずしお出力したすので泚意しおください。

sed s/$'\t'//
sed $'s/\t//'

どのようなスクリプトが sed に枡されおいるかは set -x で確認しおみるずいいです。きっずタヌミナルには以䞋のように出力されるず思いたす。ブログ䞊ではスペヌスに芋えるかもしれたせんが s/ の埌ろにはタブ文字が入っおいたす。

+ sed 's/ //'

$'\t' を䜿っおタブ文字を取り陀く際の䟋をいく぀か曞いおおきたす。

# 行頭のタブだけを削陀
sed s/^$'\t'//

# 先頭のタブ文字だけを削陀
sed s/$'\t'//

# 党おのタブ文字を削陀
sed s/$'\t'//g

もし $'\t' が䜿えない堎合は printf などに出力しおもらいたしょう。䞊段の䟋ではダブルクオヌトが必芁になるかもしれたせん。

# コマンド眮換でタブ文字を出力 (1)
sed s/"`printf '\t'`"//

# コマンド眮換で sed スクリプトごず出力 (2)
sed "`printf 's/\t//'`"

# 倉数による展開
tab=`printf '\t'`
sed s/${tab}//

改行文字に眮換する

タブ文字の話から逞れたすが「ある文字列を改行に倉換したい」堎合の話です。たず゚ラヌ䟋です。

sed s/\<br\>/$'\n'/

なぜ゚ラヌになるかは sed に枡されたスクリプトを芋おみればわかりたす。sed は改行をコマンドの区切りにしおいるため䞊蚘の曞き方だず2぀のコマンドに分離しおしたっおいるからです。

s/<br>/
/

正しく改行に倉換するには以䞋のように曞きたす。゚スケヌプの仕方やクオヌトの仕方は人それぞれですのであくたで䞀䟋です。

sed s/\<br\>/$'\\\n'/

sed に枡されるスクリプトはこうなりたす。バックスラッシュで぀ながっおいるので1぀のコマンドずしお扱っおくれたす。

s/<br>/\
/

逆に「改行を眮換したい」堎合があるかず思いたすが、これを sed でやろうずするずかなり面倒なので他のコマンドの䜿甚をおすすめしたす。Qiita に曞いたような気もするけど

その他

倉数を䜿う

タブの話に戻りたす。倉数はシェルによっお先に展開されるので $'\t' を䜿甚した堎合ず同じです。

tab=$'\t'
sed "s/${tab}//"

クラスを䜿う

[:cntrl:] や、[:blank:]、[:space:] などを䜿うこずで制埡文字や空癜を取り陀くこずができたす。「タブ文字だけ」ずいうのには向いおいたせんが s/[ ]// ←スペヌスずタブず曞くよりはわかりやすいかなず思いたす。

sed "s/[[:cntrl:]]//"

IFS から郚分文字列展開でタブだけ取り出す

bash ではシェルの IFS 環境倉数には <スペヌス><タブ><改行> が栌玍されおいるので郚分文字列展開でタブだけを䜿甚するこずができたす。シェルによっおはこの展開は䜿えたせんし、IFS も䞀定ではないので危険です。これはただのネタですので忘れおください。

sed "s/${IFS:1:1}//"

tr を䜿う

甚途によっおは sed よりもずっずシンプルです。

tr -d '\t'

sed はシェルスクリプトやタヌミナル䞊で䜿おうずするずクオヌトやバックスラッシュなどのせいで難しくなりたす。たずは sed スクリプトを別で䜜成しお緎習しおみるのがいいず思いたす。タヌミナルからは -f オプションでコマンドファむルを指定できたす。ヒアドキュメントで fd から読むこずもできたりしたす。

sed -f command.sed

  • 2014幎06月20日に蚘事修正