Terminal.app で タブを入力するには?
Terminal.app で,bash に対してキーボードからタブ文字が入力できません.どうすればよいのでしょうか? stty tabs とか,terminal type を ansi, vt102, xterm などに切り替えたりしてみましたが,キーボードのタブキーも,control + I も受け付けられません.
sed で 置換文字列の中にタブを入れたいのですが...
Terminal.app で,bash に対してキーボードからタブ文字が入力できません.どうすればよいのでしょうか? stty tabs とか,terminal type を ansi, vt102, xterm などに切り替えたりしてみましたが,キーボードのタブキーも,control + I も受け付けられません.
sed で 置換文字列の中にタブを入れたいのですが...
>Terminal.app で,bash に対してキーボードからタブ文字が入力できません.どうすればよいのでしょうか?
分かりません
>sed で 置換文字列の中にタブを入れたいのですが...
安直に Perl で
置換文字例 が <> の場合
perl -pe 's/<>/¥x09/g' < a.txt > b.txt
¥t
機能しないのです.\t は文字 t を陽に示します.それで,\\\t というのも試してみましたが,バックスラッシュという文字とtという文字の2文字と解釈されるようで,だめでした.
(上で,バックスラッシュが全角文字になってしまいましたが,本来は半角です.)
ついでに,^I という文字列も試してみましたがだめでした.
¥¥t はどうですか?
echo ¥t >test
として、hexdump test とすると、
hexdump test
0000000 740a
0000002
ですが、
echo ¥¥t >test とすると、
hexdump test
0000000 5c74 0a00
となり、逆スラッシュ(0x5c)が入ってます。
echo "¥t">test
でも同じになります。
エスケープシーケンスは bash でも sed でも使えないようです.
具体的には,テキストファイルの中のタブを削除する,あるいはスペースに置き換えるというようなことをやりたかったのです.単純化すると,
sed 's/(ここにタブ)//g' input.txt >output.txt
あるいは
sed 's/(ここにタブ)/ /g' input.txt >output.txt
という具合です.このようなものを Emacs で sh のシェルスクリプトとして書いて保存し,それを使って一応目的は果たしたのですが,コマンドラインでタイプできないというのは解せません.そんなはずはないと思うのですが,Terminal.appの仕様なのでしょうか? sh, csh でもダメです.
sed で escape文字が解釈されなかったので Perl で書きました
ただ Perl は高機能なため処理が遅くなります
16進で書くと速度が上がりますので sed に近ずくかと思います
perl -pe 's/<>/¥t/g' < a.txt > b.txt
>perl -pe 's/<>/¥x09/g' < a.txt > b.txt
perl -pe 's/¥x3c¥x3e/¥x09/g' < a.txt > b.txt
しばらくファイル名の補完機能は使っていなかったので忘れていました.
The macosxhints Forum というところに同じ質問があり (http://forums.macosxhints.com/archive/index.php/t-26928.html),タブはコマンドラインでは打てないので,ちょっと違いますがコントロールキャラクタを一括して指定するというのが一つの手として出ていました.つまり,
sed 's/[[:cntrl:]]//g' input.txt >output.txt
という具合です.いっぽう fink の sed 3.02 ではエスケープが使えて,s/\t//g というコマンドでOKらしいです.
単に sed の仕様の問題だったということでしょうか。
sed -E で拡張性機表現が使えますが、それでは行けませんか?
使える表現、以下が参考になると思います。
http://www.kt.rim.or.jp/〜kbk/regex/regex.html#SED
sedに問題はありません.(sed 's/(タブ)//g' $1 というシェルスクリプトで問題なくできるので.) 問題は,コマンドインタプリタ (シェル) でタブがタブとしてタイプできないということでした.
Mac OS X 10.3 の sed には -E というオプションはないようです.(man sed にはそのようなオプションは出てきません.)
ターミナルでまずいのなら、X11 の xterm を使うのはどうなんですか?
試していませんが,状況は同じだと思います.(繰り返しになりますが) 問題はシェルでタブがファイル名補完という機能に割り当てられているためなので.
> 問題はシェルでタブがファイル名補完という機能に割り当てられている
これはできない理由にはならないと思います。シェルがタブを別の目的の解釈してしまうのなら、シェルにそういうことをさせずに、そのまま sed に渡すようにすればいいので。自分はこの方面には詳しくないので、こうすればいい、と解決策を提供することはできませんが、その方法はあるはずです。
自分はこういう簡単な場合なら sed を使わずに tr で済ませています。
tr "¥t" " " < input_file > output_file
で OK です。(ちなみに ¥t を "" で囲んでいるのはシェルに ¥t を解釈させないためです。tr の場合はこれで済みます)
仕様と言いたかったのは、¥t などの拡張正規表現が使えないことです。
-E オプションはありませんでしたか。確かに man sed には出てこないですね。perl でなくとも tr という手もありましたね。
Terminal.app で タブを入力するには?