bash / cut / split을 사용하여 문자열의 일부 추출
다음과 같은 문자열이 있습니다.
/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
첫 번째 (유일한) 캡처 그룹에서 발견 된 것을 대체하는 것을 의미합니다. 이것이 이름입니다.
Here's the breakdown matching the string with the regular expression:
/var/cpanel/users/ joebloggs :DNS9=domain.com joebloggs
sed 's#.*/ \([^:]*\) .* #\1 #'
Using a single sed
echo "/var/cpanel/users/joebloggs:DNS9=domain.com" | sed 's/.*\/\(.*\):.*/\1/'
Using a single Awk:
... | awk -F '[/:]' '{print $5}'
That is, using as field separator either /
or :
, the username is always in field 5.
To store it in a variable:
username=$(... | awk -F '[/:]' '{print $5}')
A more flexible implementation with sed
that doesn't require username to be field 5:
... | sed -e s/:.*// -e s?.*/??
That is, delete everything from :
and beyond, and then delete everything up until the last /
. sed
is probably faster too than awk
, so this alternative is definitely better.
참고URL : https://stackoverflow.com/questions/19482123/extract-part-of-a-string-using-bash-cut-split
'Programing' 카테고리의 다른 글
Modulus Divison은 어떻게 작동합니까? (0) | 2020.08.26 |
---|---|
CPU에서 Tensorflow를 실행하는 방법 (0) | 2020.08.26 |
삼항 연산자를 사용할 때 C에서 문자열 연결을 허용하지 않는 이유는 무엇입니까? (0) | 2020.08.26 |
Android에서 아래 첨자와 위 첨자 문자열 (0) | 2020.08.26 |
파이썬에서 문자열을 목록으로 변환하는 방법은 무엇입니까? (0) | 2020.08.26 |