2009-03-12 4 views
3

У меня есть путь в виде строки в раковине-скрипт, может быть абсолютным или относительным:Каков наилучший способ выполнения строковых манипуляций в сценарии оболочки?

/usr/userName/config.cfg

или

../config.cfg

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

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

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

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

ответ

6

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

file=`basename "$filename"` 

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

Благодаря размотать для некоторых новых синтаксиса для этого (который предполагает ваше имя файла хранится в $ файла):

file=$(basename $filename) 
+0

+1, но я бы рекомендовал более новый синтаксис: «Файл = $ ($ базовых filename) "при условии, что $ filename содержит имя ввода. – unwind

+0

@unwind. Спасибо за это, я не знал об этом синтаксисе. Это сейчас просто предпочтительнее (но, по сути, то же самое), или это быстрее? – RobS

+0

Я думаю, что это считается более читаемым, но это все –

1

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

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

11

Если вы хорошо с помощью Баша, вы можете использовать Баш строку разложение:

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

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

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

Кроме того, простой замены конструкция доступна также:

FILE=${FILE// /_} 

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

Одна косая черта снова, не является жадным.

+2

+1. это решение намного быстрее, чем выполнение внешней команды, но, как упоминалось выше, вы должны использовать '#!/bin/bash'. –

+1

+1 для предотвращения использования бесполезной вилки для 'basename'. – Jens

+2

+1 Спасибо за объяснение Double Hash/Double Процент жадных парней и их синглов Hash/Percent, не жадных. Это хороший материал. – javadba

1

Я обычно использую СЭД с помощью простого регулярного выражения, например:

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

результат:

>echo "/usr/userName/config.cfg" | sed -e 's+^.*/++' 
config.cfg 
Смежные вопросы