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

Выход не сохраняется в каких-либо файлах, нет. Но вы можете использовать команду script для записи сеанса терминала. Просто запустите

script

Затем запустите свои команды, как обычно. Когда вы наберете exit, вы выйдете из программы сценария. Все входные и выходные данные можно найти в файле с именем typescript в текущем каталоге. Вы можете использовать less -R typescript для чтения и поиска по нему.

Как обычно, рекомендуется прочитать руководство перед использованием новой команды. [F6]

1
задан 30 December 2016 в 07:59

6 ответов

В дополнение к очень хорошим 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 on 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
16
ответ дан 23 May 2018 в 23:07
  • 1
    Вы просто хвастаетесь! ;-) (но у вас есть upvote, потому что он умный, и я многому научился, а bash сделал меня LOL) – Fabby 20 February 2015 в 16:09
  • 2
    bash следует использовать printf "%s\n" "$line": цитирование строки $, чтобы сохранить пробелы, и избежать некоторых проблем эха (интерпретация специальных символов и т. д.). и избегает необходимости добавлять --. – Olivier Dulac 20 February 2015 в 22:04
  • 3
    @OlivierDulac достаточно справедлив. Я не хотел усложнять ситуацию для других случаев, но поскольку Cuanglm добавил IFS= и -r, я могу также пройти весь путь и сделать его надежным. – terdon♦ 20 February 2015 в 22:19
  • 4
    @terdon: это все для лучшего хорошего ^^ (и я уже сделал +1, хотя это очень информативно для начинающих) – Olivier Dulac 20 February 2015 в 22:21
  • 5
    @OlivierDulac Я могу заверить вас, что если бы я публиковал Unix & Linux , я бы использовал printf, IFS =, -r и цитировал :). Я часто упрощаю вещи для аудитории AU, которые часто менее удобны в командной строке. – terdon♦ 20 February 2015 в 22:23

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

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

Затем переместите файл обратно в infile.

13
ответ дан 23 May 2018 в 23:07

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

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

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

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

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

Параметр maxdepth означает, что это не будет возвращаться в директории.

5
ответ дан 23 May 2018 в 23:07

Еще одна опция python:

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

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

4
ответ дан 23 May 2018 в 23:07

Grep

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

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

Grep

#!/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 May 2018 в 23:07
  • 1
    вы можете использовать там регулярное выражение, например [print(l, end = "") for l in open(fil).readlines() if not re.match("HERE IT IS", l)], но оно не намного эффективнее, чем startswith. Я задавался вопросом, как [print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")] не будет выводить результат в списке. – Avinash Raj 20 February 2015 в 16:54
  • 2
    В первый раз, когда я наткнулся на него, мне показалось странным. Он генерирует команду печати (или любое другое действие, которое вы хотели бы с ней) для всех элементов в определенном списке. – Jacob Vlijm 20 February 2015 в 16:57
  • 3
    Undeleting это, просто для удовольствия :) – Jacob Vlijm 20 February 2015 в 16:58

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

ex -sc 'g/^HERE IT IS/d' -cx file
g глобальный поиск d удалить x сохранить и закрыть
1
ответ дан 23 May 2018 в 23:07

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

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