1

以下のような内容のテキスト ファイルがあるとします。

'Jack', is a boy
'Jenny', is a girl
...
...
...

Cli で perl を使用して、単一引用符のペアの間の名前のみをキャプチャしたい

cat text| perl -ne 'print $1."\n" if/\'(\w+?)\'/'

上記のコマンドは私が実行したものでしたが、うまくいきませんでした。シェルで「'」が台無しになっているようです。

perl スクリプトを作成するなど、他のオプションがあることはわかっています。しかし、私の状況を考えると、シェル コマンド ラインでこれを満たす方法を見つけたいと思います。

お知らせ下さい。

4

2 に答える 2

3

シェルには、引用符で囲まれた文字列を連結するという興味深い特性があります。'...'またはむしろ、"..."文字列ではなく、利用可能なエスケープの修飾子と見なされるべきです。'...'コマンドの- で囲まれた部分には、使用可能なエスケープがありません。の外で'...'は、単一引用符を として渡すことができます\'。連結プロパティと一緒に、次のように一重引用符を埋め込むことができます

$ perl -E'say "'\''";'
'

-eコードに。最初'はエスケープなしゾーンを出て、\'一重引用符で'囲み、エスケープなしゾーンに再び入ります。perl見えたのは

perl        // argv[0]
-Esay "'";  // argv[1]

これにより、コマンドが作成されます

cat text| perl -ne 'print $1."\n" if/'\''(\w+?)'\''/'

(引用符は正規表現でエスケープする必要はありません)、または

cat text| perl -ne "print \$1.qq(\n) if/'(\w+?)'/"

(二重引用符を使用してコマンドを囲みますが、二重引用符で囲まれたqq//文字列を使用し、シジルをエスケープして$シェル変数の補間を回避します)。

于 2013-06-07T08:49:57.817 に答える
0

perl ステートメントを手動でエスケープする必要のないいくつかの方法を次に示します

  1. キャットインザバッグテクニック

    perl -ne "$(cat)" text
    

    入力を求められます。終了するには、 -catを押します。CtrlD

    これの 1 つの欠点: perl ステートメントは再利用できません。これは、バリエーションによって対処されます。

    $pline=$(cat)
    perl -ne "$pline" text
    


  2. bash ビルトイン、read

    複数行:

    read -rd'^[' pline
    

    単線:

    read -r pline
    

    ユーザー入力を変数に読み込みますpline

    スイッチの意味:

    • -r: バックスラッシュの解釈を停止readします (例: デフォルトではとしてread解釈されます)\ww
    • -d: コマンドを終了する文字を決定しreadます。
      • ^[は に対応する文字で、 -を押しEscて挿入します。^[CtrlVEsc

  3. ヒアドキュメントとスクリプト。
    (スクリプトはないと言いましたが、これは迅速で汚いので、そうかもしれません...)

    cat << 'EOF' > scriptonite
    print $1 . "\n" if /'(\w+)'/
    EOF
    

    それからあなたは単に

    perl -n scriptonite text
    
于 2013-06-07T15:00:07.363 に答える