Node.js:末尾の改行なしでコンソールに出力しますか?


682

末尾の改行なしでコンソールに出力する方法はありますか?consoleオブジェクトのドキュメントがあることについては何も言いません。

console.log()

改行付きで標準出力に出力します。この関数は、-とprintf()同様の方法で複数の引数を取ることができます。例:

console.log('count: %d', count);

最初の文字列にフォーマット要素が見つからない場合util.inspectは、各引数でが使用されます。

回答:


1056

使用できますprocess.stdout.write()

process.stdout.write("hello: ");

詳細はドキュメントを参照してください


7
これは私にとって反対の問題を解決しました。改行文字を印刷したいときに文字通りconsole.log印刷\nしていました。
ポール

@Paulproは改行文字 '\ n'ではありませんか?
Alexander Mills

3
@AlexMillsこれは改行文字のエスケープシーケンスですが、改行文字自体ではありません。` followed by an 実際の改行文字を出力したいときに、リテラルn`が返されました。
ポール、

378

また、カウントダウンなど、同じ行のメッセージを上書きする場合は、文字列の最後に「\ r」を追加できます。

process.stdout.write("Downloading " + data.length + " bytes\r");

18
質問に対する答えではありませんが、これは素晴らしい答えです。試すのが待ちきれません。
longda 2013年

8
これがないではない私のためのWindows上で動作します。しかし、非犬でうまく動作します。
chowey 2013

45
Windowsの場合、あなたはのように、同等のコード「\ 033 [0G」を使用することができますprocess.stdout.write("Downloading " + data.length + " bytes\033[0G");
GarciadelCastillo

19
ようにするには、ANSIエスケープコード strictモードでの作業に@GarciadelCastilloでコメントして上に与えられたが、進リテラル置き換える\033進リテラルで\x1b、このように:\x1b[0G。(厳密および非厳密なコードの両方で動作するもの)
いくつかの

7
\ rを文字列の最後ではなく先頭に置くだけで、Windowsで機能します。
daremkd 2016

20

Windowsコンソール(Linuxの場合も)では'\r'、同等のコードに置き換える必要があります\033[0G

process.stdout.write('ok\033[0G');

これは、VT220端末エスケープシーケンスを使用して、カーソルを最初の列に送信します。


1
現在の行だけでなく、どのようにして複数の行を遡りますか?一番上のプログラムは、実行中にバッファ全体を上書きして、完了時にそこにあったものを復元できるようです。誰でもこれがどのように行われるか知っていますか?i.imgur.com/AtCmEjn.gif
Chev

私はそれがおそらく次のようなものを使用していると思います: github.com/mscdex/node-ncurses github.com/chjj/blessed
Brandon

1
それは動作しますが、私は次のようにもカーソルを取得[\] 39し、カーソルが最初の文字で強調表示されています:var spinner = '|/-\\'.split('');process.stdout.write("["+this.randomElement(spinner)+"] "+message+"\033[0G");
loretoparisi

1
@Chev Topは特別であり、ANSIエスケープコードで記述できるものではありません。実際、ncursesを使用しているため、大きなCライブラリを持たない組み込みシステムでは見つかりません
cat

1
@Chev:ほとんどの人は自分のFUDのためにハードコードされたエスケープシーケンスで遊ぶことを思いとどまらせますが、現在ほとんどすべての人がVT100を使用しているため、互換性はもはや問題ではありません。あなたが言及している機能は「代替画面」の動作です。基本的なイントロはman console_codes(Linuxまたはオンライン)にあり、私のお気に入りのリファレンスはwww2.phys.canterbury.ac.nz/dept/docs/manuals/unix/DEC_4.0e_Docs/…(その内容の99%はまだ機能しています)です。 。注意のみ:広く展開する前に、いくつかの異なる端末での実験をテストする準備をしてください。
i336_

18

行を上書きできることに関して上記の@rodowiによって行われたすばらしい追加への拡張/強化として:

process.stdout.write("Downloading " + data.length + " bytes\r");

コードで見たように、ターミナルカーソルを最初の文字に配置したくない場合は、次のことを検討してください。

let dots = ''
process.stdout.write(`Loading `)

let tmrID = setInterval(() => {
  dots += '.'
  process.stdout.write(`\rLoading ${dots}`)
}, 1000)

setTimeout(() => {
  clearInterval(tmrID)
  console.log(`\rLoaded in [3500 ms]`)
}, 3500)

\r次の印刷ステートメントの前にを配置することにより、置換文字列が前の文字列を上書きする直前にカーソルがリセットされます。


13

util.printも使用できます。読む:http : //nodejs.org/api/util.html#util_util_print

util.print([...])#同期出力関数。プロセスをブロックし、各引数を文字列にキャストしてから、stdoutに出力します。各引数の後に改行を入れません。

例:

// get total length
var len = parseInt(response.headers['content-length'], 10);
var cur = 0;

// handle the response
response.on('data', function(chunk) {
  cur += chunk.length;
  util.print("Downloading " + (100.0 * cur / len).toFixed(2) + "% " + cur + " bytes\r");
});

39
util.printは現在廃止されています
Petr Peller、2013年

(node:7616) DeprecationWarning: util.print is deprecated. Use console.log instead.
Green

10

多くの答えが示唆されているようです:

process.stdout.write

エラーログは次の場所に出力されます。

process.stderr

代わりに次を使用します:

console.error

なぜバッファリングprocess.stdout.write('\033[0G');が行われておらずstdoutdrainイベントを待機する必要があるのかを考えている人のために(詳細

書き込みが戻るfalseと、drainイベントが発生します。


4

これらのソリューションはどれも私のために働くん、process.stdout.write('ok\033[0G')とだけ使用して'\r'ちょうど新しい行を作成しますが、マックOSX 10.9.2に上書きされることはありません。

編集: 私はこれを使用して現在の行を置き換える必要がありました:

process.stdout.write('\033[0G');
process.stdout.write('newstuff');

4

ストリクトモードを使用すると、次のエラーが発生しました。

ノードエラー:「オクタルリテラルは厳密モードでは許可されていません。」

次のソリューションが機能します(ソース)。

process.stdout.write("received: " + bytesReceived + "\x1B[0G");

ocltalリテラルtobsone.orherの数値形式を変更します
FrancescoMM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.