2010-11-07 3 views
2

Как удалить строки, если они начинаются с символа «#», используя регулярные выражения Perl?Perl Regular Expressions + удалить строку, если она начинается с #

Например (необходимо удалить следующие примеры)

line="#a" 
line="  #a" 
line="# a" 
line=" # a" 

...

необходимый синтаксис

$line =~ s/......../.. 

или пропустить цикл, если строка начинается с "#"

от моего кода:

open my $IN ,'<', $file  or die "can't open '$file' for reading: $!"; 
while(defined($line = <$IN>)){ 

. 
. 
. 

ответ

12

Вы не удаляете строки с помощью s///. (В цикле, вы, вероятно, хотите next;)

В этом фрагменте вы в курсе, что это будет:

while (my $line = <IN>) { 
    if ($line =~ /^\s*#/) { next; } 
    # will skip the rest of the code if a line matches 

    ... 
} 

Более короткие формы /^\s*#/ and next; и next if /^\s*#/; возможны.


perldoc perlre

/^\s*#/ 
  • ^ - "начало строки"
  • \s - "символ пробела"
  • * - "0 или более раз"
  • # - всего #
+0

нравится: $ line = ~/^ \ s * #/ ?? –

+0

, но как этот синтаксис удалить строку? –

+0

может быть, как это $ line = ~ s/^ \ s * # // s; ? –

2

Программа (Cut & паста целиком, включая раздел DATA, отрегулируйте притон линию, бегите)

#!/usr/bin/perl 
use strict; 
use warnings; 

while(<DATA>) { 
    next if /^\s*#/; # skip comments 
    print;   # process data 
} 

__DATA__ 
# comment 
data 
    # another comment 
more data 

Выход

data 
more data 
3

Основе Aristotle Pagaltzis's answer вы могли бы сделать:

perl -ni.bak -e'print unless m/^\s*#/' deletelines.txt 

Здесь ключ -n делает perl помещает цикл вокруг кода, который вы предоставляете , который будет читать все файлы, которые вы передаете в командной строке в последовательности . Переключатель -i (для «на месте») говорит, чтобы собрать из вашего сценария вывод и перезаписать исходное содержимое каждого файла . Параметр .bak для параметра -i указывает perl сохранять резервную копию исходного файла в файле с именем после имени исходного файла с добавлением .bak. Для всех этих бит см. Perldoc perlrun.

удаление ссылок.TXT (изначально):

#a 
b 
    #a 
# a 
    c 
     # a 

становится:

b 
    c 
0
$text ~= /^\s*#.*\n//g 

Это удалит все строки с # во всем файле $ текста, не требуя, чтобы вы Переберите каждой строки текст вручную.

Смежные вопросы