1

谁能看到我在 grep 语句中做错了什么?我想我只是缺少一个转义字符。

for i in "${!PORTARR[@]}"; do
  grep \<td\>"${!PORTARR[i]}"\<\/td\> tmp/portlist >> databases/ports.db
done

*** 更新 ***

不幸的是,这是行不通的。这最终是我想要做的。

从这个字符串:

<tr><td>4</td><td>TCP</td><td>UDP</td><td>Unassigned</td><td>Official</td></tr>

我需要得到这个:

4,Unassigned
4

1 回答 1

3

我怀疑您的意思是写${PORTARR[i]}( 的i第 th 元素PORTARR) 而不是(由 的第 th 元素${!PORTARR[i]}命名的变量的值); 所以:iPORTARR

for i in "${!PORTARR[@]}"; do
  grep \<td\>"${!PORTARR[i]}"\<\/td\> tmp/portlist >> databases/ports.db
done

但我也推荐其他一些调整:

for elem in "${PORTARR[@]}"; do
  grep "<td>$elem</td>" tmp/portlist
done > databases/ports.db

更新:对于您更新的问题,我认为您最好使用真正的编程语言,例如 Perl:

perl -we ' my @ports = @ARGV;
           @ARGV = ();
           my %ports = map +($_ => undef), @ports;
           while(<>) {
               my $fields = m/<td>([^<]*)<\/td>/g;
               if(exists $ports{$fields[0]}) {
                   $ports{$fields[0]} = $fields[3];
               }
           }
           foreach my $port (@ports) {
               if(defined $ports{$port}) {
                   print "$port,$ports{$port}\n";
               }
           }
         ' "${PORTARR[@]}" < tmp/portlist > databases/ports.db

(免责声明:未经测试。)

于 2013-06-27T00:35:16.363 回答