Удалить строки, которые появляются после строки с определенным шаблоном в оболочке

Вы можете переустановить пакет, открыв терминал (Alt + Control + T) и используя

sudo apt-get install --reinstall nameofpackage 

(заменив nameofpackage на имя вашего пакета).

Если вы предпочитаете графический интерфейс для расширенного управления пакетами, сделайте себе одолжение и нажмите Software Center - используйте надлежащий менеджер пакетов, такой как Synaptic или Muon, который позволяет вам переустанавливать пакеты, или вы можете использовать ncurses-based Aptitude в командной строке.

4
задан 6 April 2018 в 13:46

6 ответов

Попробуйте этот сценарий оболочки. В качестве входных данных требуется 2 аргумента. Первый аргумент - это имя входного файла. Второй аргумент - требуемый шаблон для поиска. Он удалит строки после того, как шаблон будет сопоставлен в первый раз.

#!/bin/bash touch temp.txt while read line do echo "$line" | grep "$2" &> /dev/null if [ $? -eq 0 ] then echo "$line" >> temp.txt mv temp.txt $1 echo "STATUS: Pattern matched. Successful operation..." exit 0 fi echo "$line" >> temp.txt done < $1 echo "STATUS: Pattern not found. No lines are deleted..." rm -f temp.txt
0
ответ дан 17 July 2018 в 17:23

Другое решение, используя awk:

awk '/specific-pattern/{stop=1} stop==0{print}' < input_file >> output_file

Пока переменная stop равна 0 (это по умолчанию), awk будет печатать текущую строку. Однако, если текущая строка соответствует регулярному выражению / specific-pattern /, тогда stop будет установлено значение 1. Это делает stop==0 неверным, поэтому awk больше не будет выполнять оператор print.

Вход считывается из файла ввода и добавляется к output_file.

Если вы хотите сохранить линию с шаблоном, отмените две части скрипта awk.

0
ответ дан 17 July 2018 в 17:23

Спасибо @ Zanna

Я нашел это решение:

for ((i=1;i < $count+1 ;i++)) sed -n '/PATTERN/q;p' $i.txt > file_out$i.txt

Спасибо

0
ответ дан 17 July 2018 в 17:23

Попробуйте этот сценарий оболочки. В качестве входных данных требуется 2 аргумента. Первый аргумент - это имя входного файла. Второй аргумент - требуемый шаблон для поиска. Он удалит строки после того, как шаблон будет сопоставлен в первый раз.

#!/bin/bash touch temp.txt while read line do echo "$line" | grep "$2" &> /dev/null if [ $? -eq 0 ] then echo "$line" >> temp.txt mv temp.txt $1 echo "STATUS: Pattern matched. Successful operation..." exit 0 fi echo "$line" >> temp.txt done < $1 echo "STATUS: Pattern not found. No lines are deleted..." rm -f temp.txt
0
ответ дан 23 July 2018 в 18:12
  • 1
    grep имеет флаг -q (см. man grep), и проверка статуса выхода - это то, что делает if (см. help if), чтобы вы могли писать такие вещи, как if grep -q "$2"; then ... – Zanna 6 April 2018 в 14:38

Другое решение, используя awk:

awk '/specific-pattern/{stop=1} stop==0{print}' < input_file >> output_file

Пока переменная stop равна 0 (это по умолчанию), awk будет печатать текущую строку. Однако, если текущая строка соответствует регулярному выражению / specific-pattern /, тогда stop будет установлено значение 1. Это делает stop==0 неверным, поэтому awk больше не будет выполнять оператор print.

Вход считывается из файла ввода и добавляется к output_file.

Если вы хотите сохранить линию с шаблоном, отмените две части скрипта awk.

0
ответ дан 23 July 2018 в 18:12

Спасибо @ Zanna

Я нашел это решение:

for ((i=1;i < $count+1 ;i++)) sed -n '/PATTERN/q;p' $i.txt > file_out$i.txt

Спасибо

9
ответ дан 23 July 2018 в 18:12
  • 1
    Я ожидал бы, что удалить строку с шаблоном, но я думал, что вы хотите сохранить эту строку ... – Zanna 6 April 2018 в 13:48

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

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