Ответ 1
Чтобы извлечь 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
находится ли 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