Сопоставление и замена шаблона Perl для замены только 4-го слова и сохранения всего остального

Я только что понял, что у меня та же проблема. Не уверен, почему это произошло, так как я только что исправил, но, похоже, в моем случае это проблема с нехваткой места в разделах моего жесткого диска. При установке linux (kali )я разделил жесткий диск на разделы для каждой отдельной папки, (поэтому /root имел свой собственный раздел, а /usr и т. д. )не рекомендуется. поэтому, чтобы решить эту проблему, я зашел в виртуальную консоль (Режим восстановления )и запустил:

sudo apt -получить автоочистку

sudo apt -получить автоматическое удаление

и это сработало! Надеюсь, это поможет

1
01.11.2020, 15:43
2 ответа

В Perl вы можете сделать:

 #!/usr/bin/env perl

while (<>) {
  ## split the line into fileds on whitespace
  my @fields = split(/\s+/);
  ## set the 4th field (numbering starts at 0) to "0" if
  ## this line starts with an R (since that's what you had originally)
  $fields[3] = 0 if /^R/;
  ## join thew fields with a space and print
  print join(" ", @fields). "\n";
}

Если вы запустите приведенное выше на своем примере, вы получите:

$ foo.pl file 
R5_427 MMP15@2:S VDD:1 0 TC1=0.0004785156
R5_428 MMP15@2:S lninst_M55:S 0

Или, если вы хотите сохранить исходную логику с более сложным регулярным выражением, вы можете сделать:

#!/usr/bin/env perl
open(my $RD, '<', $ARGV[0]);
while(<$RD>)
{
  ## you want chomp, not chop. chomp only removes trailing newlines
  ## while chop removes the last character no matter what it is.
  ## You also don't need the $line variable, perl will default to $_
  chomp;
  ## You don't need to capture every group, only the
  ## ones you will use later. Also, to allow for only
  ## three fields, you need '\s*.*' and not '\s+.*'
  if (/^(R\S+\s+\S+\s+\S+)\s+\S+(\s*.*)/) {
    ## No need for a temp variable, just print
    print "$1 0 $2\n";
  }
  else {
    print "$_\n";
  }
}

Конечно, для этого вам не нужен скрипт, вы можете просто написать один -лайнер:

$ perl -lane '$F[3] = 0 if /^R/; print join(" ", @F)' file 
R5_427 MMP15@2:S VDD:1 0 TC1=0.0004785156
R5_428 MMP15@2:S lninst_M55:S 0
2
18.03.2021, 22:53

Один из способов — пропустить первые 3 поля и заменить четвертое на 0,0 только для резисторов.

$ perl -pe 's/^R(?:\S+\s+){3}\K\S+/0.0/' file
R5_427 MMP15@2:S VDD:1 0.0 TC1=0.0004785156
R5_428 MMP15@2:S lninst_M55:S 0.0
0
18.03.2021, 22:53

Теги

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