sed для разделения шины Verilog на отдельный порт

Вы смешиваете пакеты CentOS 6 ( .el6 ) с пакетами CentOS 7 ( .el7 ), что недопустимо. Они очень разные.

Вы установили mysql56-community-release-el7. * вместо mysql56-community-release-el6 * , откуда из вы это получите.

Удалите этот неправильный источник пакета:

yum remove "mysql56-community-release-el7.*"

Установите правильный (как вы установили вышеупомянутый ранее), и тогда он должен работать для вас.


Найдите mysql-56-community в вашем /etc/yum.repos.d/ и отключите его, установив внутри enable = 0 , если вы не знаю, что это там делает.

4
13.04.2017, 15:36
2 ответа

Вот один из способов сделать это в perl :

(исправленная версия будет обрабатывать оба ваших примера входных данных. Также похоже, что точка с запятой внутри [] не сбивает с толку уценку выделение синтаксиса)

#! /usr/bin/perl

use strict;

sub expand {
  my ($name,$start,$stop) = @_;
  my $step = ( $start < $stop ? 1 : -1);
  my @names=();

  my $i = $start;
  while ($i ne $stop + $step) {
    push @names, "$name\[$i\]";
    $i += $step;
  }
  return @names;
};

while(<>) {
  chomp;
  s/([(),;])/ $1/g;   # add a space before any commas, semi-colons, and
                      #  parentheses, so they get split into separate fields.

  my @l=();           # array to hold the output line as it's being built

  my @line = split ;  # split input line into fields, with 1-or-more
                      # whitespace characters (spaces or tabs) between each
                      # field.

  my $f=0;            # field counter

  while ($f < @line) {
    if ( $line[$f] =~ m/module/io ) {
        push @l,$line[$f++];
        while ($f < @line) {
            if ( $line[$f] =~ m/^(.*)\[(\d+):(\d+)\]$/o ) {
                # expand [n:n] on module line
                push @l, join(", ",expand($1,$2,$3));
            } else { 
                push @l, $line[$f]
            };
            $f++;
        };
    } elsif ($line[$f] =~ m/^(?:input|output)$/io) {
        # use sprintf() to indent first field to 10 chars wide.
        $line[$f] = sprintf("%10s",$line[$f]);
        push @l, $line[$f++];;

        my @exp = ();
        while ($f < @line) {
            if ( $line[$f] =~ m/^\[(\d+):(\d+)\]$/o ) {
                # extract and store [n:n] on input or output lines
                @exp=($1,$2);
            } elsif ( $line[$f] =~ m/^\w+$/io) {
                # expand "word" with [n:n] on input or output lines
                push @l,join(", ",expand($line[$f],@exp));
            } else {
                push @l, $line[$f];
            };
            $f++;
        };

    } else {
      # just append everything else to the output @l array
      push @l, $line[$f];
    };
    $f++;
  }
  print join(" ",@l),"\n";
}

Вывод:

$ ./jigar.pl ./jigar.txt 
module test ( temp_bus[3], temp_bus[2], temp_bus[1], temp_bus[0] , temp_B[1], temp_B[0] ) 
     input temp_bus[3], temp_bus[2], temp_bus[1], temp_bus[0] ; 
    output temp_B[1], temp_B[0] ; 
endmodule 

Вывод из вашего второго примера:

$ ./jigar2.pl jigar2.txt 
module test ( temp_bus[3], temp_bus[2], temp_bus[1], temp_bus[0] , temp_B[1], temp_B[0] , temp_C[1], temp_C[0] )
     input temp_bus[3], temp_bus[2], temp_bus[1], temp_bus[0] ;
    output temp_B[1], temp_B[0] , temp_c[1], temp_c[0] ;
endmodule
4
27.01.2020, 20:55

При условии, что вас интересуют только интервалы в вашем примере, было бы неудобно, но не слишком сложно сделать это в sed :

/(in|out)put/s/(\[.*\]+) *(.*);/\2\1;/
s/([A-Za-z_]+)\[3:0\]/\1[3], \1[2:0]/g
s/([A-Za-z_]+)\[2:0\]/\1[2], \1[1:0]/g
s/([A-Za-z_]+)\[1:0\]/\1[1], \1[0]/g

Немного более общее решение также несколько сложнее:

/(in|out)put/s/(\[.*\]+) *(.*);/\2\1;/
/\[[0-9:]+\]/s/$/#9876543210/
:a {
   s/([A-Za-z_]+)\[([0-9]):0\](.*)(#[0-9]+)\2([0-9]+)$/\1[\2], \1[\5]\3\4\2\5/
   ta
}
s/#9876543210$//
:b {
   s/([A-Za-z_]+)\[([0-9])([0-9]+)\]/\1[\2], \1[\3]/
   tb
}

Не то чтобы я рекомендовал делать это таким образом.

0
27.01.2020, 20:55

Теги

Похожие вопросы