Вопрос или проблема
Как я могу убрать первый ./
и завершающий /
из моего пути?
-
Мне нужно изменить следующий путь:
./dir1/dir2/file-example.json
-
Сейчас в моем коде есть:
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
).
Используя Perl
~$ perl -pe 's!^\./||/dir2/file-example.json$!!g;' oldtest.sh > newtest.sh
Используя Raku (ранее известен как Perl_6)
~$ raku -pe 's:g!^ "./" | "/dir2/file-example.json" $ !!;' oldtest.sh > newtest.sh
#ИЛИ:
~$ raku -pe 's:g[^ "./" | "/dir2/file-example.json" $] = "";' oldtest.sh > newtest.sh
Ссылки по Perl:
https://perldoc.perl.org
https://www.perl.org
Ссылки по Raku:
https://docs.raku.org
https://raku.org
.
Ответ или решение
Чтобы удалить начальную часть ./
и конечный /
из заданного пути с помощью утилиты sed
, вы можете воспользоваться несколькими методами. Здесь я предоставлю подробные объяснения различных подходов, а также краткие примеры для выполнения вашей задачи.
Использование sed для редактирования пути
-
Сначала, определим, что нам нужно удалить:
- Начало строки:
./
- Конец строки:
/
- Начало строки:
-
Стандартное выражение sed:
Мы можем использовать команду заменыs
вsed
, чтобы убрать оба элемента. Важным моментом является то, что мы можем выбрать любой символ в качестве разделителя, чтобы избежать экранирования символа/
. Например:sed 's|^\./||; s|/$||' ваш_файл
Это выражение означает:
s|^\./||
— убирает./
в начале строки.s|/$||
— убирает символ/
в конце строки.
Здесь
^
обозначает начало строки, а$
— конец строки. -
Упрощенное выражение с обратными ссылками:
Если в вашем файле пути всегда одинаковые, как указано в вашей задаче, можно использовать обратные ссылки для более простого управления:sed -E 's|^\./([^/]+)/.*|\1|' ваш_файл
Здесь:
-E
включает расширенные регулярные выражения, что позволяет использовать более сложные шаблоны.([^/]+)
захватывает любую последовательность символов, которая не содержит/
(это будет вашей нужной папкой).\1
возвращает захваченную группу.
-
Запись в файл:
Если вы хотите сразу записать результат в оригинальный файл, добавьте опцию-i
:sed -i 's|^\./||; s|/$||' ваш_файл
Использование Perl
Поскольку вы указали sed
, однако упомянули и Perl, вот как можно сделать то же самое с помощью Perl:
perl -pe 's{^\./}{}; s{/$}{};' ваш_файл
Проверка результата
После выполнения одной из вышеуказанных команд результат будет таким:
dir1
Заключение
Команды выше дают возможность легко обработать и изменить пути в вашем файле, удаляя ненужные символы. Использование sed
— удобный и эффективный способ выполнения такой задачи в Unix-подобных системах. Не забывайте всегда делать резервные копии важных файлов перед их изменением.