Как я могу удалить начало и конец с помощью sed?

Вопрос или проблема

Как мне удалить первое ./ и завершающий / из моего пути?

  • Сейчас мой код выглядит так:

    sed -i 's/dir2\/file-example.json//' test.sh
    

    и результат выводится так:

    ./dir1/
    
  • Но я хотел бы, чтобы он выглядел так:

    dir1
    

    чтобы удалить ./ и / с начала и конца, оставив только имя директории.

Это возможно?

Вам не обязательно использовать / в качестве разделителя регулярного выражения, но вы можете использовать “любой другой одиночный символ” – экранируя его. info -n 'Команда "s"' sed:

Команда s (как в замените) вероятно самая важная в
sed и имеет много разных опций. Синтаксис команды ‘s’
это s/REGEXP/REPLACEMENT/FLAGS.
[…]
Символы / могут быть однородно заменены любым другим одиночным
символом в любой данной команде s. Символ / (или любой другой символ, используемый вместо него) может появляться в REGEXP или REPLACEMENT только в том случае, если он предшествован символом \.

Таким образом, вы можете использовать s%pattern%replacement% вместо s/pattern/replacement/ здесь, чтобы избежать необходимости экранировать / в шаблоне как \/:

sed -i 's%\./%%; s%/dir2/file-example.json%%;' test.sh

Обратите внимание, что точка также должна быть экранирована, чтобы отключить её специальное значение в регулярных выражениях.

Используя “обратные ссылки”, это может стать еще проще:

sed -i 's%\./\(dir1\)/dir2/file-example.json%\1%;' test.sh

где \1 ссылается на первое обрамленное частичное регулярное выражение (в данном случае: dir1).

Ответ или решение

Для решения задачи по удалению начальной части ./ и конечного символа / из строки с путем с использованием утилиты sed, существует несколько эффективных подходов. Ваша цель заключается в преобразовании пути, чтобы на выходе осталась лишь имя директории без лишних символов.

Шаги по решению задачи

  1. Установка условия: Убедитесь, что вы работаете с правильной строкой, содержащей ваш путь, например, ./dir1/.

  2. Использование sed для замены: Для удаления символов в sed вы можете воспользоваться следующим синтаксисом:

    sed -i 's%^\./%%; s%/$%%;' test.sh

    Здесь мы используем два выражения:

    • s%^\./%% удаляет префикс ./, где ^ указывает на начало строки.
    • s%/$%% удаляет символ / в конце строки.
  3. Использование обратных ссылок: Если структура строки более сложная, например, вы хотите также сохранять некоторые части пути, можно использовать обратные ссылки. Вот пример:

    sed -i 's%^\./\(.*\)/$%\1%' test.sh

    В этом выражении \(.*\) захватывает все символы между ./ и /, а \1 возвращает захваченную часть без лишних символов.

Пример использования

Предположим, у вас есть файл test.sh, содержащий следующую строку:

./dir1/

После запуска команды sed с одним из предложенных выше вариантов, файл test.sh будет содержать:

dir1

Обобщение и рекомендации

  • Используйте символы, отличные от /, например, %, чтобы избежать необходимости экранировать символы в регулярных выражениях.
  • Убедитесь, что вы указали верный путь к формату файла с нужной структурой. В случаях, где структура строк может различаться, разрабатывайте выражения с учетом различных возможных вариантов.
  • Тестируйте ваши команды на небольших примерах перед их применением к реальным данным, чтобы гарантировать их корректность.

Эти подходы и техники не только решат вашу задачу, но и расширят ваши знания в области работы с sed, что полезно для общего опыта в обработке файлов и скриптов в Linux/Unix средах.

Оцените материал
Добавить комментарий

Капча загружается...