Как найти линии, соответствующие шаблону, и удалить их?

В файле с большим количеством строк я хочу удалить строки, начинающиеся с HERE IT IS,

Как я могу сделать это, используя только инструменты командной строки?

7 ответов

Решение

Пытаться sed:

sed -i '/^HERE IT IS/d' <file>

ВНИМАНИЕ: лучше сделать резервную копию при использовании -i переключатель sed:

sed -i.bak '/^HERE IT IS/d' <file>

Исходный файл останется как <file>.bak и измененный файл будет <file>,

В дополнение к очень хорошему grep а также sed ответы, которые вы получили, вот некоторые другие инструменты, которые могут сделать то же самое:

  • Несколько способов Perl:

    perl -ne '/^HERE IT IS/ || print' file > newfile
    perl -ne 'print if !/^HERE IT IS/' file > newfile
    perl -ne 'print unless /^HERE IT IS/' file > newfile
    

    Вы можете добавить -i перейдите к любому из примеров, чтобы отредактировать файл на месте:

    perl -i.bak -ne '/^HERE IT IS/ || print' file        
    
  • (Г) AWK

    awk '!/^HERE IT IS/' file > newfile
    

    Более новые версии (4.1.1 и позже) GNU awk (по умолчанию awk в Linux) также можно редактировать файл на месте:

    gawk -i inplace  '!/^HERE IT IS/' file
    
  • Ракушка (bash, zsh, kshвозможно другие). Это немного глупо, но это можно сделать, но другие инструменты лучше.

    while IFS= read -r line; do 
      [[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line"
    done < file > newfile
    

Я хотел бы использовать grep отфильтровать их. Например:

grep -v "^HERE IT IS" infile > outfile

Затем переместите выход обратно в путь.

sed это определенно путь.

Эта небольшая модификация команды @heemayl дала вам удаление строки, независимо от того, используется ли тот же случай в шаблоне или нет, из-за I в ссылке на шаблон.

sed -i '/HERE IT IS/Id' <file>

Если у вас есть несколько файлов в каталоге, для которого вы хотите сделать это, вы можете объединить это с find как так.

find . -maxdepth 1 -type f -exec sed -i.bak '/HERE IT IS/Id' {} +

Опция maxdepth означает, что это не будет повторяться в каталогах.

Другой вариант с питоном:

#!/usr/bin/env python3
[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]

Где f - путь к файлу между кавычками.

Grep

grep -P '^(?!HERE IT IS)' file

(?!HERE IT IS) утверждение с отрицательным прогнозом, которое заставляет механизм регулярных выражений совпадать со всей границей начала строки (которая обычно соответствует^) только если за ним не следует строка HERE IT IS

питон

#!/usr/bin/python3
import sys
fil = sys.argv[1]
with open(fil) as f:
    for line in f:
        if not line.startswith('HERE IT IS'):
            print(line, end="")

Сохраните скрипт в файле, скажем script.py и затем запустите его с помощью приведенной ниже команды на терминале.

python3 script.py infile

Вы можете использовать Vim в режиме Ex:

ex -sc 'g/^HERE IT IS/d' -cx file
  1. g глобальный поиск

  2. d удалять

  3. x сохрани и закрой

Другие вопросы по тегам