Входной файл1:
dog 123 4335
cat 13123 23424
deer 2131 213132
bear 2313 21313
Я даю совпадение по шаблону из in other file
(как dog 123 4335
из file2).
Я соответствую шаблону строки, dog 123 4335
и после печати всех строк без строки соответствия мой вывод:
cat 13123 23424
deer 2131 213132
bear 2313 21313
Если использовать только без адреса строки, используйте только шаблон, например, 1s
как сопоставить и напечатать строки?
text-processing
sed
grep
loganaayahee
источник
источник
Ответы:
Предполагая, что вы хотите сопоставить всю строку с вашим шаблоном, с GNU
sed
это работает:Стандартный эквивалент:
Со следующим вводом (
infile
):Выход:
Объяснение:
/^dog 123 4335$/
ищет нужный шаблон.:a; n; p; ba;
является циклом, который выбирает новую строку из input (n
), печатает ее (p
) и переходит обратно к метке a:a; ...; ba;
.Обновить
Вот ответ, который приближается к вашим потребностям, то есть шаблон в файле file2, извлеченный из файла file1:
Внедренные grep и cut находят первую строку, содержащую шаблон из файла file2, этот номер строки плюс один передается на хвост, плюс один, чтобы пропустить строку с шаблоном.
Если вы хотите начать с последнего матча, а не с первого, это будет:
Обратите внимание, что не все версии tail поддерживают добавочную нотацию.
источник
sed -n '/^dog 123 4335$/ { :a; p; n; ba; }' infile
(с переключенными p и n) успешно включает в себя строку, которая также соответствует.Если у вас достаточно короткий файл, он
grep
может работать:5000 - это мое предположение о «достаточно коротком», так как
grep
находит первое совпадение и выводит его вместе со следующими 5000 строками (файл не должен иметь такого количества). Если вы не хотите совпадения, вам нужно его обрезать, напримерЕсли вы не хотите использовать первое, но последнее совпадение в качестве разделителя, вы можете использовать это:
Эта строка читает
animals.txt
в обратном порядке строк и выводит до строки включительноdog 123 4335
и затем снова переворачивает для восстановления правильного порядка.Опять же, если вам не нужно совпадение в результате, добавьте хвост. (Вы также можете усложнить выражение sed, чтобы отбросить его буфер перед выходом.)
источник
На практике я бы , вероятно , использовать ответ Aet3miirah в большую часть времени и ответ Алексея замечательно , когда требуется перемещаться по линиям (кроме того , он также работает с
less
). ОТО, мне действительно нравится другой подход (который является своего рода обратным ответом Жиля :При вызове с
-n
флагомsed
не выводит по умолчанию строки, которые обрабатывает больше. Затем мы используем двухадресную форму, в которой говорится, что нужно применить команду от строки, совпадающей/dog 123 4335/
до конца файла (представлена$
). Рассматриваемая командаp
печатает текущую строку. Таким образом, это означает «печатать все строки от одной совпадающей/dog 123 4335/
до конца».источник
dog
строку, хотя это не требуется здесь.sed -n '/dog 123 4335/,$p' | tail -n +2
также удалит матчЕсли вам нужно прочитать шаблон из файла, подставьте его в команду sed. Если файл содержит шаблон sed:
Если файл содержит буквенную строку для поиска, заключите в кавычки все специальные символы. Я предполагаю, что файл содержит одну строку.
Если вы хотите, чтобы совпадение представляло собой целую строку, а не просто подстроку, оберните шаблон
^…$
.источник
sed
есть0,/dog.../d
для этого.$ more +/"dog 123 4335" file1
источник
less
.tac
.+
был заменен-p
в POSIX 7: pubs.opengroup.org/onlinepubs/9699919799/utilities/more.html, но еще не реализован в util-linux 2.20.1. И это также печатаетskipping..
и некоторые дополнительные символы новой строки (я думаю, для stderr, так может быть хорошо).С
awk
:источник
Один из способов использования awk:
где file2 содержит ваши шаблоны поиска. Во-первых, все содержимое файла file2 хранится в массиве «a». Когда файл1 обрабатывается, каждая строка проверяется на соответствие массиву и печатается, только если ее нет.
источник
Если ввод является обычным файлом, который можно найти :
С GNU
grep
:С
sed
:GNU с
grep
именем w /-m
option завершит ввод во время совпадения и оставит свой (lseekable) ввод fd сразу после точки, в которой было найдено последнее совпадение. Таким образом, вызовgrep
w /-m1
находит первое вхождение шаблона в файле и оставляет входное смещение точно в правильном месте,cat
чтобы записать все, после первого совпадения шаблона в файле, в стандартный вывод.Даже без GNU
grep
вы можете делать то же самое с POSIX-совместимымsed
- когдаsed
q
он указан, он оставляет свое входное смещение там, где он делает. Однако GNUsed
не соответствует стандартам, поэтому вышеприведенное, скорее всего, не будет работать без GNU,sed
если вы не вызовете его с помощью-u
переключателя.источник
sed
совместное использование потоков, показанное здесь, не является специально (хотя, да, стандарт, на который делается ссылка, делает конкретный примерsed
как утилита, способная таким образом) для показанного в свободной форме и условно кооперативного рабочего процесса. Примечательно, что все стандартные утилиты предназначены и определены таким образом, чтобы взаимодействовать и совместно использовать позиции курсора входных потоков, не нарушая при дальнейшей обработке следующего считывателя какую-либо обработку.grep -q
должен сделать это; спокойноgrep
должен вернуться, как только будет найдено какое-либо совпадение на входе, и все оставшиеся входные данные по умолчанию не должны использоваться по умолчанию.Мой ответ на вопрос в теме, без сохранения шаблона во втором файле. Вот мой тестовый файл:
GNU sed:
Perl:
Вариант Perl с шаблоном в файле:
источник
Wth
ed
:Это отправляет одну
p
команду rint в ed-строку; Команда печати ограничена до одного после (+1
)dog 123 4335
совпадения до конца файла ($
).источник
Если вы не против создания временного файла, и есть в
csplit
наличии, это работает:Примечание
file1
- это входной файл и файлfile2
шаблона (как указано в вопросе).Длинная форма приведенной выше команды:
т.е.
csplit
без указанногоprefix
выше флага будет создан файлxx00
(с префиксомxx
и суффиксом00
). С флагом выше он создает файлfile1_00
. Безquiet
флага печатается размер выходного файла (размер полученного файла).источник
Поскольку awk явно не запрещен, вот мое предложение, предполагая, что «кошка» - это совпадение.
источник
Другой способ выразить это «как удалить все строки с 1-й до совпадения (включая)», и это можно
sed
записать так:источник
sed -e '0,/MATCH PATTERN/d'
тогда?