다음과 같은 문자열이 있습니다.
/var/cpanel/users/joebloggs:DNS9=domain.com
joebloggs
이 문자열에서 사용자 이름 ( ) 을 추출하여 변수에 저장해야합니다.
문자열의 형식은 항상 제외와 동일합니다 joebloggs
및 domain.com
그래서 사용하여 두 번 문자열을 분할 할 수 있습니다 생각하고있다 cut
?
첫 번째 분할은 분할되고 :
첫 번째 부분을 변수에 저장하여 두 번째 분할 함수에 전달합니다.
두 번째 분할은 /
마지막 단어 ( joebloggs
)로 분할되어 변수에 저장됩니다.
배열과 분할을 사용하여 PHP에서 이것을 수행하는 방법을 알고 있지만 bash에서는 약간 길을 잃었습니다.
답변
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
답변
다음과 같이 함수를 정의하십시오.
getUserName() {
echo $1 | cut -d : -f 1 | xargs basename
}
그리고 문자열을 매개 변수로 전달합니다.
userName=$(getUserName "/var/cpanel/users/joebloggs:DNS9=domain.com")
echo $userName
답변
sed는 어떻습니까? 단일 명령으로 작동합니다.
sed 's#.*/\([^:]*\).*#\1#' <<<$string
- 는
#
대신 정규식 분할에 사용되는/
문자열이 있기 때문에/
거기에. .*/
마지막 백 슬래시까지 문자열을 잡습니다.\( .. \)
캡처 그룹을 표시합니다. 이것은입니다\([^:]*\)
.- 는
[^:]
콜론 _except 모든 문자를 말합니다, 그리고*
수단은 0 개 이상.
- 는
.*
나머지 줄을 의미합니다.\1
첫 번째 (유일한) 캡처 그룹에서 발견 된 것을 대체하는 것을 의미합니다. 이것이 이름입니다.
다음은 정규 표현식과 일치하는 문자열을 분석 한 것입니다.
/var/cpanel/users/ joebloggs :DNS9=domain.com joebloggs
sed 's#.*/ \([^:]*\) .* #\1 #'
답변
단일 sed 사용
echo "/var/cpanel/users/joebloggs:DNS9=domain.com" | sed 's/.*\/\(.*\):.*/\1/'
답변
단일 Awk 사용 :
... | awk -F '[/:]' '{print $5}'
즉, 필드 분리 중 하나로 사용된다 /
또는 :
사용자 이름 필드 5 항상.
변수에 저장하려면 :
username=$(... | awk -F '[/:]' '{print $5}')
sed
사용자 이름이 필드 5 일 필요가없는 보다 유연한 구현 :
... | sed -e s/:.*// -e s?.*/??
즉, :
이후의 모든 항목을 삭제 한 다음 마지막 /
. sed
아마도보다 빠르기 awk
때문에이 대안이 확실히 낫습니다.