web-dev-qa-db-ja.com

TABで区切られた文字列をbashで印刷する方法は?

タブで区切られた2つの文字列を印刷しようとしています。私が試してみました:

echo -e 'foo\tbar'
printf '%s\t%s\n' foo bar

それらの両方が印刷します:

foo     bar

2つの間の空白は実際には5つのスペースです(PuTTYでマウスを使用して出力を選択する場合)。

コマンドを入力するときにCTRL + Vを使用してTABを押しても同じ結果が得られました。

タブをタブとして強制的に印刷する正しい方法は何ですか?出力を選択して、タブを使用して別の場所にコピーできますか?

そして2番目の質問:bashがタブをスペースに展開するのはなぜですか?

更新:どうやら、これはPuTTYの問題です: https://superuser.com/questions/656838/how-to-make -PuTTY-display-tabs-within-a-file-instead-of-changeing-them-to-spaces

9
Asu

Ilkkachuが言ったように、これはbashの問題ではなく、出力でタブをスペースに変換するターミナルエミュレーターの問題です。

異なる端末をチェックすると、PuTTY、xterm、konsoleはタブをスペースに変換しますが、urxvtとgnome-terminalは変換しません。したがって、別の解決策は、端末を切り替えることです。

9
JoL

2つの間の空白は、実際には5つのスペースです。

いいえ、ちがいます。 echoまたはprintfの出力には含まれません。

$ echo -e 'foo\tbar' | od -c
0000000   f   o   o  \t   b   a   r  \n
0000010

タブをタブとして強制的に印刷する正しい方法は何ですか?出力を選択して、タブを使用して別の場所にコピーできますか?

これは別の問題です。シェルではなく、出力時にタブをスペースに変換するターミナルエミュレータについてです。多くの人がそうしているわけではありません。

タブ付きの出力をファイルにリダイレクトしてそこからコピーするか、出力でunexpandを使用してスペースをタブに変換する方が簡単な場合があります。 (ただし、最初は空白がタブであったことを認識できず、可能であればすべてのタブがタブに変換されます。)もちろん、これは、出力で何をする必要があるかによって異なります。

14
ilkkachu