一般的なbashコマンドを使用してファイル/行のバックスペースキーを解釈/「実行」する方法はありますか?何かを印刷してからバックスペースを使用して削除し、最後に最終結果を作成するコンソールプログラムがあります。私が本当に欲しいのは最終結果です。
echo -e "Foo\b\b\bBar" | what_goes_here > test.log
私のtest.logには「Bar」のみを含める必要があります。この問題の1つの問題は、実際に印刷されると見なされるまでにどれだけのテキストをバッファリングする必要があるかです。私の場合、「ラインバッファリング」インタプリタで十分です。
ほとんどのユーティリティには、最初にこれらの文字を印刷しないスイッチがあります。しかし、現在使用しているユーティリティにはそのようなスイッチはありません...
ベストアンサー1
col -b
目的は次のとおりです。
$ printf 'a\bb\n' | col -b | od -tc
0000000 b \n
0000002
$ printf 'aaa\b\b\bbb\n' | col -b | od -tc
0000000 b b a \n
0000004
これに対応するsed
ものは次のとおりです。
bs=$(printf '\b')
sed "s/^[^$bs]*/&\
\
/;:1
s/\n.\{0,1\}\(.*\n\)\([^$bs]\)/\2\
\1/;s/\(.\{0,1\}\)\n\(.*\n\)$bs/\
\1\2/;t1
s/\n//g"
実際のテレタイプ(tty)時代にさかのぼると、このシーケンスは時々太字(自己入力)、下線()、またはキャンセル線()を意味するx\bx
ことがわかりました。x
x
x\b_
_\bx
x
x̲
x\b-
-\bx
x̶
これらの問題を処理するのに役立つ別のコマンドはcolcrt
コマンドです。
$ printf '_\bfo\b_o\b_ bar b\b-a\b-z\b-\n' | colcrt
foo bar baz
---
\b_
別のオプションは、\b-
U + 0332とU + 0336文字を組み合わせてUnicodeに変換することです。
これはUnicodeロケールとzsh
、ksh93
またはを想定しますbash
。
$ printf 'f\b_o\b_o\b_ bar b\b-a\b-z\b-\n' | sed $'s/\b_/\u0332/g;s/\b-/\u0336/g'
f̲o̲o̲ bar b̶a̶z̶
(パイプcolcrt
やcol -b
ハンドルx\bx
も太字で表示されます)。