2013-08-15 5 views
1

У меня есть имена файлов, которые выглядят что-то похожее на этоудалить только последнее расширение от имени файла

name_1.23.ps.png 

или

name_1.23.ps.best 

или

name_1.23.ps 

Я хочу снять случайные расширения файлов на конце и останутся только

name_1.23.ps 

Другие вопросы, похожие на это использование '.' как разделитель, но это удаляет все после имени_1.

Я хочу сделать это в командной строке (в Tcsh или Баш)

+0

На каком языке вы используете? –

+0

Вы можете использовать регулярное выражение: '/^\ w *. \ W *. \ W */gm' или просто разделите строку на' .' и возьмите первые 3 элемента. –

+0

Я использую tcsh или bash – user1958508

ответ

3

проверить это, если он работает для вашего требования:

СЭД

sed 's/\.[^.]*$//' 

Grep

grep -Po '.*(?=\.)' 

тест:

kent$ cat f 
name_1.23.ps.png 
name_1.23.ps.best 
name_1.23.ps 
name_1.23.ps 

#sed: 
kent$ sed 's/\.[^.]*$//' f 
name_1.23.ps 
name_1.23.ps 
name_1.23 
name_1.23 

#grep 
kent$ grep -Po '.*(?=\.)' f 
name_1.23.ps 
name_1.23.ps 
name_1.23 
name_1.23 

EDIT от комментариев. Я чувствую, что это будет новое требование:

Grep

kent$ grep -o '.*\.ps' f                       
name_1.23.ps 
name_1.23.ps 
name_1.23.ps 
name_1.23.ps 

СЭД

kent$ sed 's/\(.*\.ps\)\..*/\1/' f 
name_1.23.ps 
name_1.23.ps 
name_1.23.ps 
name_1.23.ps 
+0

Это не работает для меня, поскольку он оставляет некоторые файлы с .ps, а некоторые без расширения вообще – user1958508

+0

удаляет ** только последнее ** расширение. как вы хотели. если это не сработало для вас в некоторых случаях, pls показывает пример ввода. @ user1958508 – Kent

+0

Я хочу снять что-либо после «.ps», но если оно заканчивается только «.ps 'держать его как то же самое. – user1958508

0

Попробуйте это:

string="name_1.23.ps.png" 
array=(${string//./ }) 
echo "${array[0]}.${array[1]}.${array[2]}" 
1

Мы можем использовать операцию Баш строки, которая удаляет самый короткий матч в Glob Паттен из назад строки. Мы будем использовать «. *» Для шаблона glob.

filename="name_1.23.ps.png"              
echo ${filename%.*}                
# the above output name_1.23.ps 

Этот ответ больше подходит для моих собственных ссылок, поскольку я возвращаюсь на эту страницу несколько раз. (Это не удовлетворяет дополнительным требованиям OP для сохранения исходной строки, если она заканчивается только «.ps»).

Смежные вопросы