Удалить строки, которые не совпадают в bash

С помощью GNU sedвы можете сделать это следующим образом:

sed -Ez '
   N;s/.*\nRecommended Weight: (\S+)\n.*\x00(.*\nWGHT[[:blank:]]+)\S+\n/\2\1\n/
' fileA fileB

Там, где опция -Eвключает опции extended regex facilityи -z, каждый файл обрабатывается как одна строка, а несколько файлов разделяются нулем (\0).

0
02.09.2020, 20:16
3 ответа

Sed не изменяет ваши файлы (, если не указан флаг -iдля реализаций, которые его предоставляют ). Он читает файл и записывает в стандартный вывод, как показано ниже.

$ sed -n '/Yesterday/p' file.txt
Yesterday, 13:21https://...
$ cat file.txt
Today, 12:34https://...
Today, 12:43https://...
Yesterday, 13:21https://...
Nottoday, 12:32https://

Чтобы удалить все строки, не соответствующие Todayили Yesterday, вы можете использовать редактор Ed.

printf '%s\n' 'v/Today\|Yesterday/d' w q | ed -s file.txt

v— это обратная глобальная команда, поэтому dудаляет все строки, не соответствующие Todayили Yesterday. wзаписывает изменения и qзавершает работу. Флаг -sдля Эда запускает его в тихом режиме.

Вы также можете использовать Sed с флагом -i,

sed -n -i '/Yesterday\|Today/p' file.txt
2
18.03.2021, 23:07

Выполнено двумя методами awk и python

команда

 awk '!/Today|Yesterday/' filename

выход

Nottoday, 12:32https:

Питон

#!/usr/bin/python
import re
h=re.compile(r'Today|Yesterday')
k=open('p','r')
for i in k:
    if not re.search(h,i):
        print i.strip()

выход

Nottoday, 12:32https:
0
18.03.2021, 23:07

Чтобы отредактировать файл на месте с помощью sed, вам потребуется не -стандартная -iопция :

.
# GNU syntax à la perl (now also in busybox, NetBSD, OpenBSD):
sed -i -e /Yesterday/b -e /Today/b -e d your-file

# FreeBSD syntax (also in derivatives like macOS):
sed -i '' -e /Yesterday/b -e /Today/b -e d your-file

Командаbsedbвыдает (эквивалент next/ continueна некоторых других языках ), в то время какddудаляет пространство шаблона (, которое в конечном итоге не печатается ). Поэтому мы удаляем все строки, кроме строк, содержащих Yesterdayили Today.

Или использовать perl(, чьи -iнекоторые sedреализации позаимствовали):

perl -i -ne 'print if /(Yester|To)day/' your-file

Стандартные базовые регулярные выражения, используемые в sedили ed, не имеют оператора |чередования, однако некоторые реализации sedимеют -Eдля переключения на . ] расширенные регулярные выражения (эта опция также будет в следующей версии спецификации POSIX для sed(, а неed)).

sed -Ei '/(Yester|To)day/!d' your-file

Реализация GNU sedтакже поддерживает \|в качестве оператора чередования в своих основных регулярных выражениях (без -E/-r):

sed -i '/\(Yester\|To\)day/!d' your-file
1
18.03.2021, 23:07

Теги

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