3

ファイル内の行から「テスト」単語の後の単語が必要です。実際には、「テスト」単語の前に単語を入れたくありません。

そのパターンは…

例えば:

入力:

***This is a*** test page.

***My*** test work of test is complete.

出力:

test page.

work of test is complete.
4

2 に答える 2

5

純粋なワンライナー:

while read x; do [[ $x =~ test.* ]] && echo ${BASH_REMATCH[0]}; done <infile

入力: infile

This is a test page.
My test work of test is complete.

出力:

test page.
test work of test is complete.

file からすべての行を読み取りinfile、その行に文字列が含まれているかどうかを確認してからtest、残りの行 ( を含むtest) を出力します。

で同じ:

sedの/。(test. )/\1/' infile (おっと!これは間違っています!.*欲張りなので、例の 2 行目から切りすぎています)。これはうまくいきます:

sed -e 's/\(test.*\)/\x03&/' -e 's/.*\x03//' infile

いくつかの速度テストを行いました(元の(間違った)バージョンの場合)。その結果、小さなファイルの場合、ソリューションのパフォーマンスが向上します。大きなファイルの場合は、 の方が適しています。大きなファイルにはさらに優れているこのバージョンも試しました。

awk 'match($0,"test.*"){print substr($0,RSTART)}' infile

で同様:

perl -ne 's/(.*?)(test.*)/$2/ and print' infile

2 行のサンプル入力ファイルを使用し、毎回複製しました。すべてのバージョンが 1000 回実行されます。結果は次のとおりです。

  Size |  bash  |  sed   |  awk   |  perl
   [B] |  [sec] |  [sec] |  [sec] |  [sec]
------------------------------------------
    55 |  0.420 | 10.510 | 10.900 | 17.911
   110 |  0.460 | 10.491 | 10.761 | 17.901
   220 |  0.800 | 10.451 | 10.730 | 17.901
   440 |  1.780 | 10.511 | 10.741 | 17.871
   880 |  4.030 | 10.671 | 10.771 | 17.951
  1760 |  8.600 | 10.901 | 10.840 | 18.011
  3520 | 17.691 | 11.460 | 10.991 | 18.181
  7040 | 36.042 | 12.401 | 11.300 | 18.491
 14080 | 72.355 | 14.461 | 11.861 | 19.161
 28160 |145.950 | 18.621 | 12.981 | 20.451
 56320 |        |        | 15.132 | 23.022
112640 |        |        | 19.763 | 28.402
225280 |        |        | 29.113 | 39.203
450560 |        |        | 47.634 | 60.652
901120 |        |        | 85.047 |103.997  
于 2013-06-03T07:43:02.613 に答える