1

我需要帮助来查找文本中的字符串。

从下面的文字

我需要找到/infiletext 之后的第一次出现${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
4

3 回答 3

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***
于 2013-10-12T19:33:22.240 回答
1

尝试这样做:

perl -0777ne '
    print $1 if m!/infile.*?/fields\n(.*?)^$!ms and qr<\${SALE}> .. eof
' file
于 2013-10-12T19:30:13.720 回答
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***
于 2013-10-12T20:39:56.327 回答