Заменяйте символы по определенному индексу, отсчитываемому сзади

Я хочу изменить некоторые символы в строке, которую я создаю. Я делаю файлообмен и из каждого файла мне нужно добавить информацию о «stat». Например, имя файла "K181_111126.CATProduct" приводит к "K181_111126.CATProduct.2011-11-28 13:33:33.722342000 +0100" . Последние 16 символов, которые мне не нужны, я решил:

 find . -type f -exec stat -c%n.%y {} \; | sed 's/.\{16\}$//' 

Результат: "K181_111126.CATProduct.2011-11-28 13:33:33" Моя проблема в том, что мне нужно изменить пространство (9-й символ сзади) между датой и временем с помощью «-» и всех «:» в время (13:33:33) с точкой "."
Строки имеют разную длину, так что я могу рассчитывать только сзади. Может кто-нибудь мне помочь?

  • Как переместить строку в текстовый файл вверх или вниз на одну строку?
  • grep на одну строку перед матчем плюс матч
  • Как удалить символ новой строки из строк, предшествующих определенному шаблону?
  • sed: удалить все совпадения в файле и вставить некоторые строки, в которых первое совпадение было
  • Как скопировать строки из середины строк (между строками) до конца строк
  • Подстановка первого вхождения шаблона в строку, для всех строк в файле с sed
  • Можно ли сопоставить несколько конкретных номеров строк (не диапазон) с sed?
  • Насколько хорошо работает grep / sed / awk на очень больших файлах?
  • 3 Solutions collect form web for “Заменяйте символы по определенному индексу, отсчитываемому сзади”

    Заменяйте пространство и двоеточия одновременно с помощью немного более длинного регулярного выражения.

     find . -type f -exec stat -c%n.%y {} \; | sed 's/ \(..\):\(..\):\(..\).\{16\}$/-\1.\2.\3/' 

    Пробел до 24-го символа с конца сопоставляется, затем мы сопоставляем и фиксируем следующие 2 символа, запятую, следующие 2, комру и другую 2; то последние 16 сопоставляются и заменяются ничем. Первое захваченное выражение можно вызвать с помощью обратной ссылки \1 (вторая с \2 и т. Д.). Другими словами, две цифры после пробела «заменяются» собой, то есть эффективно сохраняются, а затем точка, следующие две и т. Д.

    Я думаю, что это то, что вы ищете:

     $ s='K181_111126.CATProduct.2011-11-28 13:33:33.722342000 +0100' $ echo "$s" | rev | sed -E 's/.{16}//; s/:/./; s/:/./; s/ /-/' | rev K181_111126.CATProduct.2011-11-28-13.33.33 

    Это использует rev для обратного ввода символа строки, так что его легче обрабатывать и, наконец, rev снова

    • s/.{16}// удалить первые 16 символов
    • s/:/./; s/:/./ s/:/./; s/:/./ изменить первые два : к .
    • s/ /-/ изменить первое пространство на -
     find ... | sed -Ee ' s/.{16}$// :a;s/:([^:[:blank:]]*)$/.\1/;ta s/[[:blank:]]([^[:blank:]]+)$/-\1/ ' 

    Где после удаления оставшихся 16 символов так же, как и вы, мы настраиваем цикл для постепенного преобразования : -> . и когда это будет сделано, измените последний самый пустой символ на тире. Это необходимо, так как имя файла также может содержать пустые символы, и мы должны игнорировать их.

    Interesting Posts

    Как использовать ssh в функции (bash)?

    Установите дистрибутив Linux из уже загруженного

    Определение языков, доступных при загрузке – LiveCD

    Не удалось обновить прошивку «Ошибка обработки архива»

    поместите «источник / etc / profile» в /etc/bash.bashrc и не сможете открыть окно терминала в ubuntu 16.04

    Как выбрать, какую графическую карту использовать?

    Список всех файлов под разными папками с одинаковым именем

    Как мне перейти на Init-System-helper V1.13

    Значок приложения Lowres при переключении окон (alt-tab)

    Как приостановить USB-устройство?

    Потерял контроль над окнами, отправленными на монитор по HDMI, который xrandr не обнаруживает

    Получать уведомления от avahi

    Как сделать modsecurity, чтобы наказать пользователей, добавив задержку при обнаружении некоторых SQL-инъекций

    Проблема с systemd & ksoftirqd

    Есть ли все равно, чтобы автоматически монтировать файловую систему, когда я открываю символическую ссылку на каталог в этой файловой системе?

    Linux и Unix - лучшая ОС в мире.