sed -ie 's/\/0?\//\/?\//g' ~/tmp
Во-первых, вы можете использовать другие символы, кроме косой черты, в качестве разделителей для
s///
, что позволит вам использовать косые черты без экранирования. Во-вторых, как отмечает @Stéphane, с-ie
e
будет использоваться как расширение для файла резервной копии, поэтому вы получите файл резервной копии с именемтемпе
. Я бы изменил расширение (или удалил его) и переписал следующим образом:sed -i.bak -e 's,/0?/,/?/,g' ~/tmp
Теперь легче увидеть фактический шаблон, которому он соответствует:
строкилитеральная строка//
и/ 0/
,/0?/
, которая заменяется на/?/
. (В ERE?
будет соответствовать нулю или одной копии предыдущей группы, то есть нулю или единице0
).Вопросительный знак в замене не является особым, поэтому он появится буквально. Как указано в других ответах, вам нужно использовать группировку (
(...)
с ERE или\(...\)
с BRE) для захвата частей шаблона и затем\1
в замене, чтобы поставить их обратно.Что-то вроде этого:
sed -i.bak -Ee 's,/0*([1-9]),/\1,g' ~/tmp
Хотя учтите, что перед ним по-прежнему будет стоять косая черта, поэтому первый ноль в
08.05.2017
не будет заменен.Использование Ракешем
\
здесь, вероятно, является разумным ходом, если вы хотите удалить ведущие нули из всех слов. Опять же, изменение12:03:04
на12:3:4
может оказаться не тем, что вам нужно.Последний пример изменения
08.05.2017 01:03:56
нав 1:03 08.05
можно выполнить с помощью одногоsed
команда:$ echo '05/08/2017 01:03:56 AM' | sed -Ee 's,0*([0-9]+)/0*([0-9]+)/[0-9]+ 0*([0-9]+):([0-9]+):[0-9]+ ([AP]M),at \3:\4 \5 on \1/\2,' at 1:03 AM on 5/8
Я не смотрел, какие другие форматы ввода вы хотите принять.