sed удалить все слова до совпадения

Я не совсем понимаю, чего вы пытаетесь достичь.

Насколько я понял,вы можете обратиться к этому ответу и попытаться заменить свой второй цикл forна:

for file in `ls $folder | egrep 'error_[0-9]{8}_[0-9]{3}\.json'`

Он будет фильтровать вывод вашего ls только с файлами, соответствующими шаблону:

error_[0-9]{8}_[0-9]{3}.json

Вы можете более точно фильтровать с помощью шаблона, который соответствует только датам, начинающимся с «20XX», месяцу между «01» и «12» и дню между «01» и «31», чтобы ограничить фильтр.

6
09.08.2019, 17:51
5 ответов

Использованиеawk:

awk '/^STAC$/,/$ /' input

Это напечатает все строки между STACи чем угодно (, включая совпадающие строки)


Или используя grep, который поддерживает параметр -z, (BSD grep не поддерживает):

Treat input and output data as sequences of lines, each terminated by a zero byte (the ASCII NUL character) instead of a newline.

grep -z 'STAC' input
3
27.01.2020, 20:20

sed работает построчно, поэтому ваша попытка не сработает.

Итак, как это сделать с помощью sed? Определите диапазон адресов, начиная со строки STAC(/^STAC$/)до конца файла ($). Их нужно напечатать, а все остальное(!)следует dудалить:

sed -i '/^STAC$/,$!d' myfile
14
27.01.2020, 20:20

Другим вариантом может быть использование скриптового редактора, такого какed:

printf '%s\n' '1,/^STAC/-1 d' 'wq' | ed -s myfile

Это печатает две команды вed:

  • удалить строки с 1 по (строку перед той, которая начинается сSTAC)
  • записать файл обратно на диск и выйти

Опция -sзапрещает печать edпо умолчанию числа прочитанных и записанных байтов.

7
27.01.2020, 20:20

Вариант awk, который печатает все строки после совпадения (, включая совпадение):

$ awk '/^STAC$/ { out=1 } out' file
STAC
asd
as

Это соответствует строке, которая содержит только строку STAC, и устанавливает outв ненулевое значение -. Для каждая строка, если outне равно -нулю, выведите ее.

Используйте $0 == "STAC"вместо /^STAC$/, чтобы выполнить сравнение строк вместо сопоставления с регулярным выражением.


Чуть более запутанный, но короче, использование логического результата сопоставления с регулярным выражением в виде целого числа (будет 0 для несоответствия -и 1 для совпадения):

awk 'p += /^STAC$/' file

Если результат в pне равен -нулю, а это будет точка, в которой регулярное выражение впервые совпадает, будет напечатана текущая строка.

Используйте p += ($0 == "STAC")вместо p += /^STAC$/для сравнения строк вместо сопоставления с регулярным выражением.

9
27.01.2020, 20:20

grep -wn STAC file.txt | cut -d":" -f 1 | xargs -I % sed '1,%d' file.txt

Получить номер строки слова, передать его xargs и использовать sed для удаления.

0
27.01.2020, 20:20

Теги

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