2016-03-18 2 views
2

У меня есть журнал с записями, какBash: любой способ извлечь первую часть этой строки?

touch_file_1:23_1786880:/home/user/project 

Есть ли способ извлечь только «touch_file_123» часть в переменную? число, следующее за ним, является inode, и я хочу получить только имя файла без inode и конечного пути.

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

Имейте в виду, мое первоначальное имя файла может иметь двоеточия в нем, как хорошо, я хочу, чтобы все двоеточие и знак подчеркивания и цифры в моем имени файла неповрежденными

ответ

1

Вы можете сделать это:

str='touch_file_1:11_2_3_1786880:/home/user/project' 

echo "${str%_*}" 
touch_file_1:11_2_3 

"${str%_*}" будет усечь последнее встречное подчеркивание и все, что следует за ним.

+0

спасибо, будет ли это работать, даже если имя файла имеет символы подчеркивания, а затем цифры? – stfudonny

+0

, к сожалению, это не сработает, если в имени файла есть символы подчеркивания, за которыми следуют номера, он отменит часть имени файла. Я попробовал его с файлом touch_me_1_2_3, и он просто вернул touch_me, есть ли способ вернуть исходное имя файла, даже если в нем есть символы подчеркивания и цифры? – stfudonny

+0

Последнее и последнее появление символа подчеркивания, за которым следует число, - это часть, которую я хочу усечь. Могут быть символы подчеркивания и цифры до этой последней части, но я хочу сохранить их неповрежденными, поскольку они могут быть частью имени файла. – stfudonny

0

Если вы используете Баш:

str='touch_file_1_2_3_1786880:/home/user/project' 

[[ $str =~ (.*)_[0-9]*: ]] && printf '%s' ${BASH_REMATCH[1]} 
touch_file_1_2_3 

регулярное выражение (без shopt -s extglob для установки) обнаружит строку чисел предшествовавших подчеркивания (_) и затем двоеточие (:) и захватить то, что есть до этого: (. *).

Это надежно работает даже для обновленных требований:

str='touch_file_1:11_2_3_1786880:/home/user/project' 
[[ $str =~ (.*)_[0-9]*: ]] && printf '%s' ${BASH_REMATCH[1]} 
touch_file_1:11_2_3 
1

В Parameter Expansion звездочки являются нежадными при использовании кратчайшего модельную матча. Если то, что вам нужно, чтобы удалить «из последнего подчеркивания перед двоеточием, в конец строки», то расширение вашего Glob должно быть достаточно:

$ a=(touch_file_1786880:/home/user/project foo_123_456_1786880:/tmp) 
$ for f in "${a[@]}"; do echo "${f%_*:*}"; done 
touch_file 
foo_123_456 

С другой стороны, если условие, чтобы удалить «из последнее подчеркивание перед двоеточием, , записывая только цифры в двоеточие, затем любые символы в конец строки ", вы можете сделать это с помощью extglob.

$ shopt -s extglob 
$ a=(touch_file_1786880:/home/user/project foo_123_456_1786880:/tmp) 
$ for f in "${a[@]}"; do echo "${f%_+([0-9]):*}"; done 
touch_file 
foo_123_456 
Смежные вопросы