Bash - Запуск сценария bash из сценария ksh

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

Я не смотрел, какие другие форматы ввода вы хотите принять.

1
22.01.2016, 08:47
0 ответов

Теги

Похожие вопросы