0

私が持っているコマンドの出力は、「成功」の場合、次の形式になります。

/ >  -------
ABC123
/ > 

ただし、このコマンドが次のようなものを出力する可能性があります (「失敗」):

/ >  -------
ABC123
 -------
DEF456
 -------
Hello (world!)
 -------
(any old string, really)
/ > 

または、これ(別の「失敗」):

/ > / >

最初の例では、次のように出力します。

ABC123

他の 2 つの例では、空の文字列を出力したいと思います。

私はこれを試しました.3番目の例ではうまくいきました:

mycmd | pcregrep -M '(?:/\s>\s{2}-{7}\n)[^\n]*(?!\n.*\n)'

しかし、最初の 2 つの例では、次のように出力されました。

/ >  -------
ABC123

私は何をすべきか途方に暮れています。/ > -------上記の私の正規表現は、先頭に一致するがそれをキャプチャするのではなく、改行で終わる別の行が続いていない場合にのみ次の行に一致する試みでした。この問題を解決する以外のものを使用しても問題ありませんが、またはpcregrepでこれを表現することはできません。Python を使用しますが、私のニーズには遅すぎます。何か助けはありますか?awksed

4

3 に答える 3

1

pcregrep次のコマンドを使用して、実際に成功を収めました(歯ぎしりをした後) :

pcregrep -Mo '^/ > {2}-{7}[\n\r]\K[^\n\r]+(?=[\n\r]/ > $)'

-oフラグがないと、最初の行が含まれていました( を使用しているにもかかわらず\K)。パターンにマッチした行だけを出力します-opcregrep結局のところ、改行を照合しようとすると、複数行モードでは否定先読みが機能しないようです。また、複数行モードで\sは改行にマッチするので使わなくなりました。

このソリューションも dbenham のソリューションも、まさに私が望んでいたものではないことに注意してください。2行目以降、最後の行以外に他の行がないことを確認したいと思っていました(つまり、別の改行が含まれていません)。これらのソリューションは、出力がどのように終了するかについてもう少し想定していますが、それは行う必要があります。

于 2014-05-08T16:37:40.103 に答える
1

awk を使用することもできます。

BEGIN {
   first_line = "";
   second_line = "";
   third_line = "";

   ctr = 0;
}
{
   if (ctr == 0 ){
      first_line = $0;
   } else if (ctr == 1) {
      second_line = $0;
   } else if (ctr == 2 ) {
      third_line = $0;
   }
   ctr++;
}
END {
   if( first_line ~ /\/ >  -------/){
      if( third_line ~ /\/ >/){
         print second_line;
      }
   }
}

出力:

$ echo "/ >  -------\nABC12\n ---\n/ >\n" | awk -f test.awk
$ echo "/ >  -------\nABC12\n/ >\n" | awk -f test.awk
ABC12
$

awkの専門家はうんざりするだろうと確信していますが、それは迅速で仕事をしました.

于 2014-05-08T13:49:34.513 に答える