Аргументом do
является одна команда; дальнейшие команды используют цепочку команд.
while true ; do date ; find... ; sleep 3600 ; done
Как glob , *.tar.gz
означает любую строку, оканчивающуюся на .tar.gz
. Sed, однако, не использует подстановочные знаки , он использует регулярные выражения , а регулярные выражения имеют другой синтаксис. Попробуйте:
sed -i -e 's/\/[^/]*\.tar\.gz//g' copyright
В приведенном выше примере регулярное выражение \/
соответствует всему, что начинается с /
(, поскольку /
используется в качестве делителя sed
, мы экранируем его как \/
), за которым следует [^/]*
, что соответствует нулю или больше любого символа, кроме /
, за которым следует .tar.gz
, где .
экранированы, чтобы они соответствовали только точкам. (В обычной нотации регулярных выражений .
соответствует любому одному символу.)
Существует много различий между подстановками (, используемыми оболочкой ), и регулярными выражениями (, которые используются sed, grep и другими важными инструментами ). В глобусе .
означает точку. В регулярном выражении .
— это подстановочный знак, означающий любой одиночный символ. В глобусе *
означает ноль или более любых символов. В регулярном выражении *
означает ноль или более предыдущей вещи .
Нам не нужно использовать /
в качестве разделителя в команде подстановки sed. Возможны и другие делители, такие как@
:
sed -i -e 's@/[^/]*\.tar\.gz@@g' copyright
Поскольку в приведенном выше примере мы используем @
в качестве делителя вместо /
, нам не нужно избегать первого /
.