Это не регулярные выражения, они - примеры расширения параметра Bash: замена переменной или специального параметра его значением. Wiki Wooledge имеет хорошее объяснение.
В основном в примере Вы имеете, ${0##*/}
переводит как:
за переменные 0$, и шаблон '/', два хеша, средние с начала параметра, удаляют самое длинное (или жадный) соответствие — до и включая шаблон.
Так, где $0
название файла, например, $HOME/documents/doc.txt
, затем параметр был бы расширен как: doc.txt
Точно так же для ${0%/*}
, шаблон /
подобран против конца параметра ( %
), с самым коротким или нежадным удаленным соответствием – который в примере выше дал бы Вам $HOME/documents
.
См. также статью о Хакере Bash Wiki.
cut
существует для точно этой цели. -d
флаг указывает разделитель, и -f
указывает который поля произвести:
cut -d: -f1 /etc/passwd
Аргумент -f
может быть что-то как 1,3
показать первые и третьи поля, или 1-3
показать первые три; существуют также -b
и -c
флаги для чтения байтов и символов вместо полей. Если Вам нужно что-то более гибкое, обычно awk
добьется цели (см. ответ Matthew),
Каждый раз, когда Вы хотите извлечь данные из табличного входа, необходимо рассмотреть awk. Это доступно в фактически каждой системе Unix, таким образом, это - хорошая привычка взять:
awk -F':' '{print $1}' /etc/passwd
-F':'
: определяет ":" как разделитель столбца.'{}'
: выполните эту инструкцию для каждой строки.print $1
: распечатайте первый столбец на экран.awk
берет имя файла, таким образом, можно пропустить канал и просто сделать awk -F: '{print $1}' /etc/passwd
– Michael Mrozek♦
30.08.2010, 05:56
tr
и at
пара примеров нескольких вещей, которые не делают).
– Paused until further notice.
31.08.2010, 01:04
Под жемчугом и awk, существует третий инструмент для таких заданий, который является sed:
sed 's/:.*//' FILE
Это - команда замены: замена от двоеточия: сопровождаемый точкой, которая является шутником для символов любого вида, любого количества (*), ни с чем.
Это (заменяют) / ИЗ/В /' с К тому, чтобы быть пустым, что означает, 'удаляют все сначала (так как sed является по умолчанию жадным) двоеточие (пока конец строки, так как sed работает хорошо со всеми строками).
Конечно, cut
прекрасная команда также, но я сказал бы от другого семейства.
В Вашем примере все 3 имени имеют ту же длину. В таких случаях - который мог бы произойти, но не настолько, вероятно, с/etc/passwd - Вы могли бы использовать colrm также:
echo "user1:x:1:4
> user2:x:2:5
> user3:x:3:6" | colrm 6
user1
user2
user3
или, конечно
cat FILE | colrm 6
(редкий случай, где useless use of cat
не применяется, потому что Вы не можете вручить colrm ФАЙЛ для действия на как параметр.)
Только для полноты, нет никакой потребности во внешних командах, оболочка (Оболочка Bourne или совместимый) может обработать ее один:
while IFS=':' read -r needed garbage; do echo "$needed"; done < input_file
Конечно, это является, вероятно, самым медленным из всех возможных решений, таким образом, для огромных файлов выбирают другого.