Почему sed возвращает больше символов, чем запрошено - PullRequest
0 голосов
/ 07 февраля 2019

В части моего сценария я пытаюсь создать список года и месяца, в который был отправлен файл.Поскольку файл содержит метку времени, я должен быть в состоянии сократить имена файлов до позиции месяца, а затем выполнить фильтрацию sort + uniq.Однако sed генерирует выброс для одного из файлов.

Я использую эту последовательность команд

  ls -1 service*json | sed -e "s|\(.*201...\).*json$|\1|g" | sort |uniq

И это работает большую часть времени, за исключением того, что в некоторых случаях он выводит всю метку времени:

$ ls
service-parent-20181119092630.json  service-parent-20181123134132.json  service-parent-20181202124532.json  service-parent-20190121091830.json  service-parent-20190125124209.json
service-parent-20181119101003.json  service-parent-20181126104300.json  service-parent-20181211095939.json  service-parent-20190121092453.json  service-parent-20190128163539.json
service-parent-20181120095850.json  service-parent-20181127083441.json  service-parent-20190107035508.json  service-parent-20190122093608.json
service-parent-20181120104838.json  service-parent-20181129155835.json  service-parent-20190107042234.json  service-parent-20190122115053.json

$ ls -1 service*json | sed -e "s|\(.*201...\).*json$|\1|g" | sort |uniq
service-parent-201811
service-parent-201811201048
service-parent-201812
service-parent-201901

Я также пробовал этот вариант, но вторая строка вывода все еще возвращается:

  ls -1 service*json | sed -e "s|\(.*201.\{3\}\).*json$|\1|g" | sort |uniq

Может кто-нибудь объяснить, почему service-parent-201811201048 возвращается после запрошенных 3 символов?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Не рекомендуется анализировать вывод ls.Пожалуйста, попробуйте вместо:

for i in service*json; do
    sed -e "s|^\(service-.*-201[0-9]\{3\}\).*json$|\1|g" <<< "$i"
done | sort | uniq
0 голосов
/ 07 февраля 2019

Ваша проблема объяснена на https://stackoverflow.com/a/54565973/1745001 (т. Е. .* является жадным), но попробуйте это:

$ ls | sed -E 's/(-[0-9]{6}).*/\1/' | sort -u
service-parent-201811
service-parent-201812
service-parent-201901

Выше требуется sed, который поддерживает ERE через -E, например, GNUsed и OSX / BSD sed.

0 голосов
/ 07 февраля 2019

service-parent-201811201048 имеет 201048, чтобы соответствовать 201....

Могу попытаться ls -1 service*json | sed -e "s|\(.*-201...\).*json$|\1|g" | sort |uniq попросить тире - до 201....

...