예를 들어, 문자열의 경우 문자를 사용하여 문자열을 절반으로 분할하면 결과는 a_link_list_java
및 입니다 . _
a_link_list
java
list_java
결과는 다음과 같습니다: list
및 java
.
이 두 부분을 두 개의 변수에 저장하고 싶습니다.
명령 을 시도했지만 cut
문자열에 표시된 한 문자에만 작동합니다.
Bash 쉘 스크립트에서 이를 어떻게 수행할 수 있습니까?
답변1
껍데기매개변수 확장다음을 수행할 수 있습니다.
$ v="a_link_list_java"
$ printf "%s\n" "${v%_*}" "${v##*_}"
a_link_list
java
단, 확장자의 패턴이 일치하지 않으면 아무것도 삭제되지 않으므로 주의하세요. 따라서 두 변환 모두 밑줄이 그어진 값을 변경하지 않습니다.
$ v=foo
$ printf "%s\n" "${v%_*}" "${v##*_}"
foo
foo
답변2
그리고 sed
:
var1=$(sed 's/_[^_]*$//' file)
var2=$(sed 's/.*_//' file)
이는 sed
매우 탐욕적이므로 두 번째 경우에는 glob이 *
앞의 밑줄을 포함하여 모든 문자를 소모합니다 _
.
산출:
$ echo "$var1"
a_link_list
$ echo "$var2"
java
답변3
를 사용하면 awk
모든 것을 개별적으로 구분 기호로 정의할 수 있습니다._
VAR1=$(awk -F'_' '{print $1}' infile.txt)
$1
첫 번째 필드를 가리키는 대신 위의 인덱스를 기반으로 원하는 필드를 인쇄할 수 있습니다 .
bash
또는 배열로 사용하고 읽을 수 있습니다 .
IFS='_' read -r -a array <<< "$myString"
그런 다음 개별 색인 번호를 읽으십시오.
echo "${array[2]}"
또는 간단히 bash 매개변수 확장을 사용할 수도 있습니다.
VAR1="${myString%_*}" # will gives you 'a_link_list'
VAR2="${myString##*_}" # will gives you 'java'
VAR3="${VAR1%_*}" # will gives you 'a_link'