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

В файле с большим количеством строк я хочу удалить строки, который запускается с HERE IT IS.

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

14
задан 29 December 2016 в 20:59

7 ответов

Попробуйте sed:

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

ПРЕДУПРЕЖДЕНИЕ: лучше для взятия резервного копирования при использовании -i переключатель sed:

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

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

28
ответ дан 23 November 2019 в 02:50

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

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

Тогда кладут обратно outfile к infile.

13
ответ дан 23 November 2019 в 02:50

sed определенно способ пойти.

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

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

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

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

maxdepth опция означает, что это не рекурсивно вызовет в каталоги.

5
ответ дан 23 November 2019 в 02:50

Другая опция Python:

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

, Где f является путем к файлу между кавычками.

4
ответ дан 23 November 2019 в 02:50

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

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

  2. d удаляет

  3. x, сохраняют и закрываются

1
ответ дан 23 November 2019 в 02:50

В дополнение к очень хорошему 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        
    
  • (g) awk

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

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

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

    while IFS= read -r line; do 
      [[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line"
    done < file > newfile
    
17
ответ дан 23 November 2019 в 02:50

Grep

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

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

Python

#!/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
4
ответ дан 23 November 2019 в 02:50

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

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