找到分布在文件中多行的字符串模式

时间:2013-10-12 19:08:27

标签: perl shell awk

我需要帮助才能在文本中找到字符串。

从下面的文字

我需要在文字/infile之后找到${SALE}的第一次出现。找到infile后,我需要找到以下/fields

的内容

从下面的示例中,输出应为

all 1 char 178,
zip 170 char 5***

输出将是/ fields和下一个 / 之间的文本。 shell,perl,awk中的解决方案将不胜感激。

脚本从这里开始

${CHKERR}

echo ${SALE}
badchar ${SALE} - | upshift - - | ssort '

/stat
/padbyte " "

/infile 0 open stlf

***/fields
   all 1 char 178,
   zip 170 char 5***

/joinkey zip
/derived country "  "

/infile /data/retprep/rethold/statezip stlf

/fields
  zipkey 1 char 5,
  state 6 char 2

/derived x 1

3 个答案:

答案 0 :(得分:2)

不是最小的,但有效:

awk 'f3 && NF {print $0;getline;print $0;f3=0} /\${SALE}/ {f1=1} f1 && /\/infile/ {f2=1} f2 && /\*\*\*\/fields/ {f3=1}' file
   all 1 char 178,
   zip 170 char 5***

答案 1 :(得分:1)

尝试这样做:

perl -0777ne '
    print $1 if m!/infile.*?/fields\n(.*?)^$!ms and qr<\${SALE}> .. eof
' file

答案 2 :(得分:1)

此解决方案通过读取文件逐个查找列表中的每个模式来工作。找到最后一个文件后,将打印文件中的行,直到找到空白行。

程序期望输入文件的路径作为命令行上的参数。

use strict;
use warnings;

my @matches = ( qr<\${SALE}>, qr<\Q/infile>, qr<\Q/fields> );

for my $match (@matches) {
  while (<>) {
    last if $_ =~ $match;
  }
}

print while ($_ = <>) =~ /\S/;

<强>输出

   all 1 char 178,
   zip 170 char 5***