Как я могу удалить строку в файле, если строка соответствует требуемому PATH в Perl? - PullRequest
1 голос
/ 06 октября 2010

Моя цель - удалить строку в файле, только если PATH совпадает с PATH в файле

Например, мне нужно удалить все строки с / etc / sysconfig PATH из / tmp / file file

 more /tmp/file

 /etc/sysconfig/network-scripts/ifcfg-lo   file1
 /etc/sysconfig/network-scripts/ifcfg-lo   file2
 /etc/sysconfig/network-scripts/ifcfg-lo   file3

Я пишу следующий код Perl (код perl, встроенный в мой bash-скрипт), чтобы удалить строки, имеющие "/ etc / sysconfig"

   export FILE=/etc/sysconfig

   perl -i -pe 's/\Q$ENV{FILE}\E// '   /tmp/file 

Но я получаю следующее после запуска кода perl: (вместо того, чтобы получить пустые строки)

  /network-scripts/ifcfg-lo file1
  /network-scripts/ifcfg-lo file2
  /network-scripts/ifcfg-lo file3

первый вопрос:

Как изменить синтаксис perl: perl -i -pe 's / \ Q $ ENV {FILE} \ E //', чтобы удалить строку, соответствующую требуемому PATH (/ etc / sysconfig)?

второй вопрос:

Аналогично первому вопросу, но строка будет удалена, только если PATH соответствует первому полю в файле

Пример:

/ tmp / file перед редактированием perl:

   file1 /etc/sysconfig/network-scripts/ifcfg-lo   
   /etc/sysconfig/network-scripts/ifcfg-lo   file2
   /etc/sysconfig/network-scripts/ifcfg-lo   file3

/ tmp / file после редактирования perl:

   file1 /etc/sysconfig/network-scripts/ifcfg-lo   

Ответы [ 4 ]

3 голосов
/ 06 октября 2010

Perl - прекрасный способ сделать это.Используйте ключ -n, а не -p.

perl -i -l -n -e'print unless /\Q$ENV{FILE}/' filename
0 голосов
/ 07 октября 2010

Если бы я делал это из командной строки, я бы, вероятно, даже не использовал Perl. Я бы просто использовал отрицательный grep:

$ mv old.txt old.bak; grep -v $FILE old.bak > old.txt

Переименование исходного файла и запись в новый файл со старым именем - это то же самое, что для вас делает переключатель -i в perl.

Если вы хотите сопоставить только первый столбец, я мог бы использовать perl, чтобы мне не приходилось использовать awk или cut. Переключатель -a в perl разбивает строку на пробел и помещает результаты в @F:

 $  perl -ai.bak -ne 'print if $F[0] !~ /^\Q$ENV{FILE}/' old.txt

Если вы считаете, что у вас все в порядке, вы можете удалить .bak обучающие колеса, в которых сохраняется копия вашего исходного файла. Или нет. Мне нравится сетка безопасности.

Подробнее о параметрах командной строки см. perlrun .

0 голосов
/ 06 октября 2010
mef@iwlappy:~$ cat /tmp/file

aaaa 
/etc/sysconfig/network-scripts/ifcfg-lofile1 
/etc/sysconfig/network-scripts/ifcfg-lofile2 
/etc/sysconfig/network-scripts/ifcfg-lofile3 
aaa 

mef@iwlappy:~$ perl -i -pe 's/$ENV{FILE}\E.*//' /tmp/file

mef@iwlappy:~$ cat /tmp/file 
aaaa
aaa

Вы можете сделать еще одно регулярное выражение для удаления пустых строк с помощью s / ^ $ //

0 голосов
/ 06 октября 2010

s/pattern/otherpattern/ не удаляет целые строки; это только изменит подстроки. Вам нужно полностью изменить свою программу, чтобы удалить целые строки. В псевдокоде это будет:

while (read in a line)
{
    if (doesn't match)
    {
         write the line back out unaltered.
    }
}

Тем не менее, его можно переписать как единый пользователь, зная, как continue и redo работают в циклах: perl -pe '$_ = <> and redo if /Q$ENV{FILE}\E/'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...