문자열에 나타나는 마지막 특정 문자를 사용하여 문자열을 반으로 자릅니다.

문자열에 나타나는 마지막 특정 문자를 사용하여 문자열을 반으로 자릅니다.

예를 들어, 문자열의 경우 문자를 사용하여 문자열을 절반으로 분할하면 결과는 a_link_list_java및 입니다 . _a_link_listjava

list_java결과는 다음과 같습니다: listjava.

이 두 부분을 두 개의 변수에 저장하고 싶습니다.

명령 을 시도했지만 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' 

관련 정보