Perl ;

Perl ;,perl,awk,sed,Perl,Awk,Sed,;



;,因此对于插脚z,使用
。然后,当您稍后计数时,查找
,并在其后面追加
z
。希望这能有所帮助。@Poton再次感谢它的成功。我试着写一个文件,它有额外的单元格,即单元格(b),单元格(c),其主体和单元格(a)相同。我在列表文件中列出了所有的单元格名称,然后尝试------foreach c(
cat list
){sed-I'1{x;s/^;/;x};/\s*单元格(${c})/I,/^}/{/pin(q)/I{x;s/&q/;q\{2},/{x;p;s/pin.*/class;/;x};x};x};/pin y/&y/{2}$/{x;p;s/pin.*/board;/;x};x}}文件结束。但它不起作用,请帮助我知道我错在哪里。提前感谢@potong请帮助我如何搜索pin(ab),我已经尝试了这个方法,但我无法搜索单元格--sed'/\spin\s(ab)/{p;s/*/1/;H;g;/^(\n1)\{2\$/s//class;/p;d}“档案,谢谢你advance@Anthonyj我不清楚你真正想要实现什么。也许你应该用最精简的例子问一个有明确目标的新问题。谢谢它的作用。但是如果我有更多的单元格,比如单元格(b),单元格(c)那么这将是冗长的代码。请建议我如何继续。谢谢@DaveCross@Anthonyj如果有更多选项需要处理,那么我会使用更数据驱动的方法。定义一个哈希,其中包含需要匹配的各行的详细信息以及需要为它们添加的文本。还可以存储各种标志。今天晚些时候我可能有时间看这个问题,但我不能做出任何承诺。@Anthonyj:当然,这不应该阻止你自己去看这个问题:-)Dave Cross我是perl新手,所以我现在学习哈希,这样我就可以得到解决。我已经修改了我的问题,请花点时间看一眼谢谢:-@Anthonyj:谢谢它的工作.但是如果我有更多的单元格,比如说单元格(b),单元格(c)那么这将是冗长的代码。请建议我如何继续。谢谢@DaveCross@Anthonyj如果有更多选项需要处理,那么我会使用更数据驱动的方法。定义一个哈希,其中包含需要匹配的各行的详细信息以及需要为它们添加的文本。还可以存储各种标志。今天晚些时候我可能有时间看这个问题,但我不能做出任何承诺。@Anthonyj:当然,这不应该阻止你自己去看这个问题:-)@Dave Cross我是perl新手,所以我现在学习哈希,这样我就可以得到解决。我已经修改了我的问题,请花点时间看一眼谢谢:)@Anthonyj:请帮助我我对awk不太了解,我们应该在使用您的代码之前调用一些东西吗?因为我无法使用您的代码,所以生成的输出与输入本身相同,没有生成错误。非常感谢您,该代码将与在任何UNIX框上的任何shell中使用任何awk一样工作,正如您在我的回答中看到的,它将针对您的示例输入运行假设它能产生您提供的预期输出。如果它不能为您提供预期输出,则可能是您没有像我的回答中所示那样使用它,或者您的实际输入与您提供的示例输入不匹配。@Ed Morton是的,我的输入中有额外的空格,所以它不起作用。谢谢,它现在起作用了吗?太好了。看看下一步该怎么做。我如果你有多个答案产生你想要的输出,我强烈建议你考虑哪一个你想成为一个你需要面对的未来,当你的需求变化。请帮助我,因为我不知道很多关于AWK,我们应该调用什么之前,使用您的代码?因为我不能使用您的代码,输出属ted与输入本身相同,没有生成错误。感谢advanceNo,该代码将像在任何UNIX机器上的任何shell中使用任何awk一样工作,正如您在我的回答中所看到的,当它针对您提供的示例输入运行时,它将生成您提供的预期输出。如果它没有为您这样做,那么您就不是在使用它在我的答案中,或者你的真实输入与你提供的样本输入不匹配。“Ed Morton,是的,在我的输入中有额外的空格,所以它不起作用。现在它工作了吗?很好。看看下一步该怎么做。如果你有多个答案产生你想要的输出,我强烈建议你考虑哪一个你想成为一个YO。当你的需求发生变化时,你需要面对未来的提升。谢谢,我想知道你的意思是如果有更多的pin?谢谢,我想知道你的意思是如果有更多的pin?谢谢
        cell (edita)  {
            test{
                 pin (Q) {
                 zzzzzz
                }
                pin (yz) {
                zzzzz 
                }
                }
                 pin (Q) {
                 add
                 }
                 pin (yz) {
                 add 
             }
        }
        cell (noedit)  {
            test{
                 pin (Q) {
                 zzzzzz
                }
                pin (yz) {
                zzzzz 
                }
                }
                 pin (Q) {
                 add
                 }
                 pin (yz) {
                 add 
             }
        }
    cell (editb)  {
            test{
                 pin (Q) {
                 zzzzzz
                }
                pin (yz) {
                zzzzz 
                }
                }
                 pin (Q) {
                 add
                 }
                 pin (yz) {
                 add 
             }
        }
cell (edita)  {
            test{
                 pin (Q) {
                 zzzzzz
                }
                pin (yz) {
                zzzzz 
                }
                }
                 pin (Q) {
                 "class";
                 add
                 }
                 pin (yz) {
                 board;
                 add 
             }
        }
        cell (noedit)  {
            test{
                 pin (Q) {
                 zzzzzz
                }
                pin (yz) {
                zzzzz 
                }
                }
                 pin (Q) {
                 add
                 }
                 pin (yz) {
                 add 
             }
        }
    cell (editb)  {
            test{
                 pin (Q) {
                 zzzzzz
                }
                pin (yz) {
                zzzzz 
                }
                }
                 pin (Q) {
                 "class";
                 add
                 }
                 pin (yz) {
                 board ;
                 add 
             }
        }
sed '1{x;s/^/;,/;x};/^cell (a)/I,/^}/{/pin (q)/I{x;s/;/&q/;/;q\{2\},/{x;p;s/pin.*/class ;/;x};x};/pin (y)/I{x;s/,/&y/;/,y\{2\}$/{x;p;s/pin.*/board ;/;x};x}}' file
sed '/cell ([^)]*)/{h;x;s/^/;:,/;x};G;/cell (edit[ab])/{/pin (q)/I{x;s/;/&q/;/;q\{2\}:/{x;P;s/\S.*/"class";/;x};x};/pin (yz)/I{x;s/:/&y/;/:y\{2\},/{x;P;s/\S.*/board/;x};x}};P;d' file
$ cat tst.awk
BEGIN {
    map["pin (Q)"] = "class ;"
    map["pin (y)"] = "board ;"
}
{ print }
$1 == "cell" { cell = "$2" }
cell == "(a)" {
    for (pin in map) {
        if ( (s=index($0,pin)) && (++cnt[pin]==2) ) {
            print substr($0,1,s-1) map[pin]
        }
    }
}

$ awk -f tst.awk file
cell (a)  {
    test{
         pin (Q) {
         zzzzzz
        }
        pin (y) {
        zzzzz
        }
        }
         pin (Q) {
         class ;
         add
         }
         pin (y) {
         board ;
         add
     }
}
BEGIN {
    map["pin (Q)"] = "class ;"
    map["pin (y)"] = "board ;"
    map["pin (z)"] = "board2 ;"
}
$ transform < input.txt > output.txt
#!/usr/bin/perl

use strict;
use warnings;

my $in_cell_a;
my $brace_level = 0;
my ($pin_q, $pin_y);

while (<>) {
  print;
  if (/{/) {
    $brace_level++;
  }
  if (/cell \(a\)/) {
    $in_cell_a = $brace_level;
  }
  if (/(\s*)pin \(Q\)/) {
    if ($pin_q) {
      print "${1}class ;\n";
      $pin_q = 0;
    } else {
      $pin_q = 1;
    }
  }
  if (/(\s*)pin \(y\)/) {
    if ($pin_y) {
      print "${1}board ;\n";
      $pin_y = 0;
    } else {
      $pin_y = 1;
    }
  }

  if (/}/) {
    if ($brace_level == $in_cell_a) {
      $in_cell_a = 0;
    }
    $brace_level--;
  }
}
#!/usr/bin/perl

use strict;
use warnings;

my $in_edit_block;
my $brace_level = 0;

my $fix = {
  'pin (Q)' => "class ;\n",
  'pin (y)' => "board ;\n",
};

my $flag;

my $fix_re = join '|', map { "\Q$_\E" } keys %$fix;

while (<>) {
  print;
  if (/{/) {
    $brace_level++;
  }
  if (/\Qcell (a)/) {
    $in_edit_block = $brace_level;
  }
  if ($in_edit_block) {
    if (my ($pad, $match) = /(\s*)($fix_re)/) {
      if ($flag->{$match}) {
        print "${pad}$fixes->{$match}";
        $flag->{$match} = 0;
      } else {
        $flag->{$match} = 1;
      }
    }
  }

  if (/}/) {
    if ($brace_level == $in_edit_block) {
      $in_edit_block = 0;
    }
    $brace_level--;
  }
}
awk '
  function addline(ind, value) {
    if(++a[ind]==2) { 
      b=$0
      sub(/[^[:blank:]].*/,"",b)
      $0=$0 "\n" b value " ;"
    }
  }
  /^cell/ {
    split("",a)
    f=0
    if(/(a)/)
      f=1
  }
  $0 ~ "pin [(]Q[)]" && f {
    addline("Q", "class")
  }
  $0 ~ "pin [(]y[)]" && f {
    addline("y", "board")
  }
1' input.txt