С помощью 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
).
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
Выполнено двумя методами 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:
Чтобы отредактировать файл на месте с помощью 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
Командаb
sed
b
выдает (эквивалент next
/ continue
на некоторых других языках ), в то время какd
d
удаляет пространство шаблона (, которое в конечном итоге не печатается ). Поэтому мы удаляем все строки, кроме строк, содержащих 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