У меня была такая же проблема с удалением /var/run
по ошибке.
Решено -создание ссылки:
ln -s /run/dbus /var/run/dbus
Использование Perl:
$ perl -ne 'if ( $_ =~ /KEYWORD/){
($first,$matched,$last) = ($1,$2,$3) if ( $_ =~ /^(.*)?\"(.*)\"(.*)$/ );
$matched =~ tr/[a-z]/x/;$matched =~ tr/[A-Z]/X/;$matched =~ tr/0-9/0/;
print $first."\"".$matched."\"".$last."\n";
}
else { print }' <<inputFile>>
Отредактировано:Если шаблон встречается несколько раз. Ниже будет работать;
$ perl -ne ' {
if ( $_ =~ /KEYWORD/ ){
$line=$_;$val=1;
while($val) {
($first,$matched,$last) = ($1,$2,$3) if ( $line =~ m/(.*?)\"(.*?)\"(.*)$/ );
$val = $line =~ s/\".*?\"/_/;
$matched =~ tr/[a-z]/x/;$matched =~ tr/[A-Z]/X/;$matched =~ tr/0-9/0/;
$matched = "_".$matched."_";
$line=$first.$matched.$last;
}
$line =~ s/[_]*_/"/g;
print "$line\n";
}else { print } }' <<inputFile>>
Использованиеsed
:
sed -E '/KEYWORD/{
:lower s/("[^"]*)[a-z]([^"]*")/\1_\2/; t lower;
:upper s/("[^"]*)[A-Z]([^"]*")/\1-\2/; t upper;
:digit s/("[^"]*)[0-9]([^"]*")/\1*\2/; t digit;
}; y/*_-/0xX/' infile
Это запустит набор кодов в блоке /KEYWORD/{...}
только тогда, когда строка совпадет со строкой KEYWORD
.
Этот ("[^"]*)[###]([^"]*")
соответствует "
и всем последующим до первого нижнего -регистра [a-z]
/верхнего -регистра [A-Z]
/цифры [0-9]
найденного символа, который передавался чем угодно до следующей кавычки совпало.
Каждая часть будет повторяться снова и снова, пока все эти символы не будут преобразованы из нижнего -регистра в _
, из верхнего -регистра в -
и из цифр в*
(примечание:выбирает разные символы, если это может произойти в вашем файле; причина в том, что мы не заменили напрямую x
, X
или 0
, потому что это вызовет бесконечный цикл для sed, так как использование циклов sed для замены всех младших/верхних/цифровых символов ).
После того, как все сделано, эти символы *_-
будут преобразованы в 0xX
.
Добавьте параметр -i
к приведенной выше команде, чтобы обновить изменения во входном файле, например sed -i -E...
.
Обновление:Команда для исправленного вопроса:
sed -E '/KEYWORD/{
:lower s/^(([^"]*("[^"]*"){0,1})*)("[^"]*)[a-z]([^"]*")/\1\4_\5/; t lower;
:upper s/^(([^"]*("[^"]*"){0,1})*)("[^"]*)[A-Z]([^"]*")/\1\4+\5/; t upper;
:digit s/^(([^"]*("[^"]*"){0,1})*)("[^"]*)[0-9]([^"]*")/\1\4*\5/; t digit;
}; y/*_+/0xX/' infile