Perl ;
Perl ;,perl,awk,sed,Perl,Awk,Sed,;
;对于插脚y,我使用了
,
,因此对于插脚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