Существует две проблемы с Вашей первой попыткой. {.*}
содержит специальные символы, которые должны быть защищены от расширения оболочкой; поместите кавычки вокруг шаблона. Кроме того, {.*}
соответствует самому длинному разделенному тексту фигурной скобки на строке, поэтому если у Вас есть строка, содержащая hello {test1} world {test2} howdy
затем вывод {test1} world {test2}
потому что .*
подобранный test1} world {test2
.
Следующее произведет только, что между скобками.
grep -o -e "{[^}]*}"
Моя исходная формулировка использовала "{.*}", но с этим самая широкая скобка нашла в строке, не, самый маленький будет возвращен...
Можно использовать sed
:
sed "s/yyyymmdd/$(date '+%Y%m%d')/g" abc.fil
, которая заменяет строку yyymmdd
на текущую дату, отформатированную по желанию.
Правка:
Если yyymmdd
- это просто формат даты, которую вы хотите заменить, то используйте эту команду (предполагается, что GNU sed
):
sed -r "s/[12][0-9]{3}[01][0-9][0-3][0-9]/$(date '+%Y%m%d')/g" abc.fil
Длинный шаблон регулярного выражения означает следующее: Первая цифра может быть 1 или 2 ([12]
), следующие три могут быть все от 0 до 9 ([0-9]
), это год. Теперь месяц: первая цифра может быть 0 или 1, а вторая - все от 0 до 9 ([01][0-9]
). И, наконец, то же самое с днем.
> today=$(date +%Y%m%d)
> sed "s/yyyymmdd/${today}/g" abc.fil
o/p: 20150127.xyz.doc
20150127.mno.dat
abc.txt