perl -eステートメントに改行を挿入しますか?


1

次のPerlワンライナーを検討してください。

perl -e '$x; $y;'

このコマンドをbashで実行しています\nが、;との間に改行()を挿入したいと思います$y。私はこれを2つの類似した方法でわずかに異なる方法で行う方法を知りたいです:

  1. メタキーシーケンスを押して改行を挿入することで、その位置に改行を挿入するにはどうすればよいですか?

  2. 非メタ文字シーケンスを入力して、その位置に改行を挿入するにはどうすればよいですか?(例えば、'$x;\n$y;'

どちらの状況でも、Perlインタープリターに次のような実際の改行が表示されるようにします。

$x;
$y;

1
@lydonchandra:Perlワンライナーに新しい行を挿入したいのはなぜですか?
ピーターモーテンセン

回答:


2

スペースを削除してから、と入力CtrlVCtrlJます。
その後Return

Ctrl-Vは、シェルが次の文字(改行)をそのまま解釈するのを防ぎます。


[Return]のようなクールなボタンはどうすればいいですか?
ドリューク

@drewk:<kbd> Ctrl </ kbd>と入力するだけです!
リス

3

あなたが尋ねた質問は、シェルがその入力をどのように解釈し、それを他のプログラムに渡すかについてのみです。Perl自体とは関係ありません。

この回答は、シェルへの新しい入力の入力に対応しています。他の回答を使用して、^V^Jコマンドライン編集を使用しながら、既存のコマンドラインに改行を挿入します。

これをスクリプトに入れることができるはずです。

foo '$x;
$y;'

コマンドに指定された引数には、スクリプト自体と同じ場所に改行があります。Unixスタイル(LFのみ)の改行を使用するような方法でこのようなスクリプトを保存するように注意する必要がある場合があります。そうしないと、CR + LF(DOS / Windowsの改行)または単にCR(古いMac-スタイルラインブリーク)。

対話型プロンプトでこれを行うこともできますが、2行目以降の継続プロンプトの前に表示されます。

$ foo '$x;
> $y;'

ではbashの、あなたはまた、使用することができます$''引用このような改行文字をエンコードするための構文を:

foo $'$x;\n$y;'

プログラムに渡される引数は、ANSI C文字列と同様の方法で処理されます。文字列に実際のバックスラッシュが必要な場合は\\、代わりにとしてエスケープする必要があります。

したがって、シングルクォートが提供するリテラル文字列のクォートが本当に必要な場合は、余分なエスケープを心配する必要がないように、おそらく埋め込み改行を使用する必要があります。



1

pico、vi、またはemacsを編集したい場合fcは、を表す組み込みコマンドを使用できますfix command

使用できfc、Bashはvi、emacsなどの定義済みエディターで最後のコマンドを開きます。これにはpicoを使用します。その後、非常に簡単に複数行の編集を使用できます。

改行とフォーマットを使用して、コマンドを編集できます。エディターを終了すると、コマンドはBashバッファーに保存され、すぐに実行されます。

Bashで、これを試してください:

$ FCEDIT=pico
$ perl -e ''
$ fc

このコマンドFCEDIT=picoは、エディターをpicoに設定するだけです。必要なエディターを設定します。エクスポートして、必要に応じて永続的にすることができます。

このコマンドperl -e ''は、新しい1行のperlスクリプトの空のラッパーです。あなたが入力するとfc、最後のコマンドは、定義されたエディタで開かれています。

次にPicoに移動して、''Perlスクリプトを挿入します。スクリプトは、テキストファイルに保存する場合と同じではなく、シェルが単一引用符の間の入力をどのように解釈するかを認識する必要があることを忘れないでください。主に、単一引用符をエスケープする必要があります\

picoで、必要なPerlコードを挿入します(Bashの解釈に従います...)

これは私がしました:

perl -e  '
print "hello\n";
print "here is a second line\n";
$i=1;
$y=2;
print "\$i=$i, \$y=$y\n\n";
'

次に、ファイルをデフォルトの名前で保存します。(picoで、Ctl+O書き込みです)、picoを終了します(Ctl + x)。Bashはコマンドをエコーし​​て実行します。

fcGNUマニュアルのセクション9.2に記載されていHERE


0

ほとんど可能です。上のbashコマンドライン、\(バックスラッシュ)は、行継続文字として使用することができます。実際にはエスケープ文字です。行の次の文字を特別なものとして扱うようにbashに指示します。

コマンドライントークン間でこれを使用して、コマンドラインに改行を追加します。動作するには、Return すぐにヒットする必要があり\ます。

#                      +-----Press return here!!
#                      V
user@host:$ cat foo | \
>           perl -e '$x; $y'

'繰り返される行の末尾で一重引用符、(およびオプションで追加の文字)を削除すると、

perl -e '$x;\ $y

を押してからEnter、複数の文字を入力して、単一引用符で終了できます'。$ yはまだアクティブであることに注意してください。


私はそれを機能させることはできません。複数行でコマンドを入力することはできますが、perlは改行を取得し、コンパイルエラーで終了します。上記のctrl-V + ctrl-Jソリューションでは発生しません。バックスラッシュの前に引用符を閉じて新しい行で再度開くと、バックスラッシュを使用して改行を取得できperl -e '$x;'\[ENTER]'$y'ます。しかし、それは実際に改行をperlに渡しません。
いんちきのキホーテ

「ここ」のドキュメントも考えましたが、それも機能しません。
いんちきのキホーテ

@quack quixote:編集してくれてありがとう。Ubuntu 9.1ベースのサーバーにPuTTY(Windows)を使用してSSHでログインしながら、このソリューションをテストしました。また、Perlワンライナーの改行の前後にprintステートメントを挿入して、それらが実行されたことを確認しました。しかし、いずれにせよ、他のソリューションの方が優れています。
ピーターモーテンセン

私はあなたが説明しようとしたことを誤解しているだけだと思います。あなたの例では、改行は実際には「$ y」の後にありますよね?そのため、バックスラッシュでエスケープされません。bashは、まだ引用符を閉じていないために発生します。ええ、うまくいきます。私はあなたが改行をエスケープするためにバックスラッシュを使用していると思ったが、それは私にとってはうまくいかなかった。
いんちきキホーテ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.