Каков наилучший способ манипулирования строками в сценарии оболочки? - PullRequest
3 голосов
/ 12 марта 2009

У меня есть путь в виде строки в shell-скрипте, может быть абсолютным или относительным:

/ USR / имя_пользователя / config.cfg

или

.. / config.cfg

Я хочу извлечь имя файла (часть после последнего /, поэтому в этом случае: "config.cfg")

Я думаю, что лучший способ сделать это с помощью простого регулярного выражения? Это правильно? Должен ли я или вместо этого использовать sed или awk?

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

Любые примеры решений также приветствуются.

Ответы [ 4 ]

11 голосов
/ 12 марта 2009

Если вы согласны с использованием bash, вы можете использовать расширения строки bash:

FILE="/path/to/file.example"
FILE_BASENAME="${FILE##*/}"

Это немного загадочно, но фигурные скобки запускают расширение переменной, а двойной хэш жадно удаляет указанный шаблон глобуса из начала строки.

Двойной %% делает то же самое с конца строки, а один процент или хеш выполняет не жадное удаление.

Также доступна простая конструкция замены:

FILE=${FILE// /_}
Например,

заменит все пробелы символами подчеркивания.

Снова один слеш, не жадный.

6 голосов
/ 12 марта 2009

Вместо манипуляции со строками я бы просто использовал

file=`basename "$filename"`

Редактировать

Благодаря раскрутке для более нового синтаксиса для этого (который предполагает, что ваше имя файла содержится в $ filename):

file=$(basename $filename)
1 голос
/ 12 марта 2009

Обычно я использую sed с простым регулярным выражением, например:

echo "/usr/userName/config.cfg" | sed -e 's+^.*/++'

результат:

>echo "/usr/userName/config.cfg" | sed -e 's+^.*/++'
config.cfg
1 голос
/ 12 марта 2009

В большинстве сред есть доступ к perl, и мне удобнее с этим для большинства манипуляций со строками.

Но, как уже упоминалось, из чего-то такого простого вы можете использовать basename.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...