如何使用dc_shell中的/ bin / sed命令删除与下一行中调用的下一个新模式匹配的模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用dc_shell中的/ bin / sed命令删除与下一行中调用的下一个新模式匹配的模式相关的知识,希望对你有一定的参考价值。

以下是我的文件示例,

         signal {
          {
            ab
            cd
          }

        "m_1_clk" {
              P {
                 '0ns' D;
                  '25ns' U;
                  '65ns' D;
                  }
             }

            "m_0_clk" {
                        P {
                          '0ns' D;
                          '25ns' U;
                          '65ns' D;
                          }
                       }

              "o_[9]" {
                     Data S Mk {
                     Active Up;
                            }
                        }

               "m_0_clk" {
                          Data S Mk {
                            Active Up;
                            }
                        }

             "m_1_clk" {
                          Data S Mk {
                          Active Up;
                            }
                        }
            }

我期待上面文件的输出是:

      signal {
           {
              ab
              cd
            }
         "o_[9]" {
                  Data S Mk {
                  Active Up;
                      }
                   }
              }     

嗨,上面是我的文件的示例我想删除模式,该模式匹配下一行中调用的下一个模式。

尝试搜索特定模式以删除不应出现在我的文件中的行。

需要在下一行中使用新模式搜索特定模式。因为第一行是在多个循环中调用。所以应该grep所有内容的具体模式。我尝试在tcl中使用下面的命令它不起作用。有谁可以帮我这个,

下面是tcl中使用的sed命令

exec /bin/sed -e {s/\m\(.*\)clk" {\.*\n\.*Data\.*//}  -i file

exec /bin/sed -e {s/\m\(.*\)clk" {\.*\n\.*P {\.*//}  -i  file
答案

您能否请尝试关注并告诉我这是否对您有帮助。(考虑到您的实际Input_file与显示的示例文件相同)

awk -v line_number=$(cat Input_file | wc -l) '/signal {/ || /"o_\[9\]" {/ || FNR==line_number{flag=1}; /^$/{flag=""} flag'    Input_file

说明:现在也为代码添加说明,如下所示:

awk -v line_number=$(cat Input_file | wc -l) '   ##Creating variable named line_number in awk script whose value is number of lines of Input_file.
/signal {/ || /"o_\[9\]" {/ || FNR==line_number{ ##checking condition here if a line contains strings either signal {  OR "o_\[9\]" { then do following:
  flag=1}                                        ##Setting variable named flag here and setting its value to 1 here.
/^$/{                                            ##Checking condition here if a line is NULL or BLANK then do following:
  flag=""}                                       ##Nullifying the variable flag here.
flag                                             ##awk works on method of condition then actions, so checking if variable flag value is NOT NULL here and not mentioning any action here so by default peint of current line will happen here.
'   Input_file                                   ##Metioning the Input_file name here.
另一答案

使用上下文相关解析器的解决方案:

use Marpa::R2 qw();

my $input = <<'INPUT';
         signal {
          {
            ab
            cd
          }

        "m_1_clk" {
              P {
                 '0ns' D;
                  '25ns' U;
                  '65ns' D;
                  }
             }

            "m_0_clk" {
                        P {
                          '0ns' D;
                          '25ns' U;
                          '65ns' D;
                          }
                       }

              "o_[9]" {
                     Data S Mk {
                     Active Up;
                            }
                        }

               "m_0_clk" {
                          Data S Mk {
                            Active Up;
                            }
                        }

             "m_1_clk" {
                          Data S Mk {
                          Active Up;
                            }
                        }
            }
INPUT

my $grammar = Marpa::R2::Scanless::G->new({
    bless_package => 'Foo',
    source => \<<'GRAMMAR',
        :default ::= action => [values] bless => ::lhs
        lexeme default = action => [ value ] bless => ::name latm => 1
        :start ::= blocks
        blocks ::= block+
        block ::= optionalname [{] contentblocks [}] optionalws
        optionalname ::= name | epsilon
        contentblocks ::= contentorblock+
        contentorblock ::= content | block
        name ~ [a-zA-Z0-9_"\x{5b}\x{5d} ]+
        content ~ [a-zA-Z0-9;'\s]*
        optionalws ~ [\s]*
        epsilon ::=
GRAMMAR
});

my $parser = Marpa::R2::Scanless::R->new({grammar => $grammar});
$parser->read(\$input);
my $output;
deleteblocks($parser->value->$*);
print $output;

sub deleteblocks {
    my ($v) = @_;
    return if ref $v eq 'Foo::block' and $v->[0][0]
        and $v->[0][0][0] !~ /signal|"o_\[9\]"/;
    if (ref $v) {
        deleteblocks($_) for $v->@*;
    } else {
        $output .= $v || '';
    }
}

输出是:

     signal {
      {
        ab
        cd
      }

    "o_[9]" {
                 Data S Mk {
                 Active Up;
                        }
                    }

           }

以上是关于如何使用dc_shell中的/ bin / sed命令删除与下一行中调用的下一个新模式匹配的模式的主要内容,如果未能解决你的问题,请参考以下文章

dc_shell/pt_shell : arrow/tab key not working

第三周

shell脚本如何判断变量为数字?

如何使用 sed 将纪元转换为人类可读的日期时间

如何使用 sed 在特定行上方的 shell 文件中添加新行

使用grep和sed递归查找和替换所有文件中的字符串[重复]