Чтобы извлечь joebloggs
из этой строки в bash с помощью расширения параметров без каких-либо дополнительных процессов ...
MYVAR="/var/cpanel/users/joebloggs:DNS9=domain.com"
NAME=${MYVAR%:*} # retain the part before the colon
NAME=${NAME##*/} # retain the part after the last slash
echo $NAME
Не зависит от joebloggs
нахождения на определенной глубине пути.
Резюме
Обзор нескольких режимов расширения параметров, для справки ...
${MYVAR#pattern} # delete shortest match of pattern from the beginning
${MYVAR##pattern} # delete longest match of pattern from the beginning
${MYVAR%pattern} # delete shortest match of pattern from the end
${MYVAR%%pattern} # delete longest match of pattern from the end
Это #
означает совпадение с начала (подумайте о строке комментария) и %
означает с конца. Один экземпляр означает самый короткий, а два экземпляра - самый длинный.
Вы можете получить подстроки в зависимости от позиции, используя числа:
${MYVAR:3} # Remove the first three chars (leaving 4..end)
${MYVAR::3} # Return the first three characters
${MYVAR:3:5} # The next five characters after removing the first 3 (chars 4-9)
Вы также можете заменить определенные строки или шаблоны, используя:
${MYVAR/search/replace}
Используется pattern
в том же формате, что и сопоставление имен файлов, поэтому *
(любые символы) являются общими, часто за ними следует определенный символ, например /
или.
Примеры:
Учитывая такую переменную, как
MYVAR="users/joebloggs/domain.com"
Удалите путь, оставляющий имя файла (все символы до косой черты):
echo ${MYVAR##*/}
domain.com
Удалите имя файла, оставив путь (удалите самое короткое совпадение после последнего /
):
echo ${MYVAR%/*}
users/joebloggs
Получите только расширение файла (удалите все до последнего периода):
echo ${MYVAR##*.}
com
ПРИМЕЧАНИЕ. Чтобы выполнить две операции, вы не можете их объединить, но должны назначить промежуточную переменную. Итак, чтобы получить имя файла без пути или расширения:
NAME=${MYVAR##*/} # remove part before last slash
echo ${NAME%.*} # from the new var remove the part after the last period
domain
#
вместо%
. Если вам нужна только часть после самого последнего двоеточия, используйте,${MYVAR##*:}
чтобы получить часть после первого двоеточия, используйте${MYVAR#*:}
${RET##*$CHOP}
или так${RET##*CHOP}
(или другим способом)? РЕДАКТИРОВАТЬ: Кажется, первое,${RET##*$CHOP}
Определите такую функцию:
И передайте строку в качестве параметра:
источник
echo $1 | cut -d -f 1 | xargs
. +1 за простые и аккуратные ответы.А как насчет sed? Это будет работать с помощью одной команды:
#
используются для разделителей регулярных выражений, а не/
потому, что в них есть строка/
..*/
захватывает строку до последней обратной косой черты.\( .. \)
отмечает группу захвата. Это есть\([^:]*\)
.[^:]
обозначает любой символ _, кроме двоеточия, а*
означает ноль или более..*
означает остальную часть строки.\1
означает замену того, что было найдено в первой (и единственной) группе захвата. Это имя.Вот разбивка, соответствующая строке с регулярным выражением:
источник
Использование одного sed
источник
Используя один Awk:
То есть, если в качестве разделителя полей используется
/
или:
, имя пользователя всегда находится в поле 5.Чтобы сохранить его в переменной:
Более гибкая реализация с
sed
этим не требует, чтобы имя пользователя было в поле 5:То есть удалите все от
:
и до, а затем удалите все до последнего/
.sed
вероятно, тоже быстрееawk
, поэтому эта альтернатива определенно лучше.источник