Я не совсем понимаю, чего вы пытаетесь достичь.
Насколько я понял,вы можете обратиться к этому ответу и попытаться заменить свой второй цикл 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», чтобы ограничить фильтр.
Использование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
sed
работает построчно, поэтому ваша попытка не сработает.
Итак, как это сделать с помощью sed
? Определите диапазон адресов, начиная со строки STAC
(/^STAC$/
)до конца файла ($
). Их нужно напечатать, а все остальное(!
)следует d
удалить:
sed -i '/^STAC$/,$!d' myfile
Другим вариантом может быть использование скриптового редактора, такого какed
:
printf '%s\n' '1,/^STAC/-1 d' 'wq' | ed -s myfile
Это печатает две команды вed
:
STAC
)Опция -s
запрещает печать ed
по умолчанию числа прочитанных и записанных байтов.
Вариант 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$/
для сравнения строк вместо сопоставления с регулярным выражением.
grep -wn STAC file.txt | cut -d":" -f 1 | xargs -I % sed '1,%d' file.txt
Получить номер строки слова, передать его xargs и использовать sed для удаления.