Вы смешиваете пакеты 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
, если вы не знаю, что это там делает.
Вот один из способов сделать это в 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
При условии, что вас интересуют только интервалы в вашем примере, было бы неудобно, но не слишком сложно сделать это в 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
}
Не то чтобы я рекомендовал делать это таким образом.