Замена определенных символов внутри кавычек

У меня была такая же проблема с удалением /var/runпо ошибке.

Решено -создание ссылки:

ln -s /run/dbus /var/run/dbus

Источники

bwrap :Не удается создать символическую ссылку в /var/run :Файл существует · Проблема #2200 · flatpak/flatpak

-1
18.04.2020, 17:04
2 ответа

Использование 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>>
2
19.03.2021, 02:28

Использование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
4
19.03.2021, 02:28

Теги

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