bash 문자열 추출

bash 문자열 추출

다음 문자열의 마지막 부분에서 두 번째 필드를 추출하고 싶습니다.

foo_1.103.debug_xx.ver21-inc-1          --> string extracted "debug_xx"
foo_1.103.1.0.release_32_xx.ver21-inc-1 --> string extracted "release_32_xx"
foo_1.103.1.0.release_xx.ver21-inc-1    --> string extracted "release_xx"

어떤 도움이라도 대단히 감사하겠습니다.

답변1

순수함 bash:

IFS='.' read -a p <<< 'foo_1.103.1.0.release_32_xx.ver21-inc-1'
echo "${p[${#p[@]}-2]}"

다음을 사용하면 이 작업을 더 쉽게 수행할 수 있습니다 awk.

awk -F. '{print$(NF-1)}' <<< 'foo_1.103.1.0.release_32_xx.ver21-inc-1'

구문 분석하려는 문자열이 파일 이름인 경우에도 다음을 사용할 수 있습니다 awk.

awk -F. 'BEGIN{for(i=1;i<ARGC;i++){$0=ARGV[i];print$(NF-1)}}' foo*

답변2

sed이를 수행하는 명령:

sed 's/foo_[0-9.]*\([^.]*\).*/\1/' inputfile

물론, inputfile문자열이 포함되어 있다고 가정합니다(예제에서와 같이). 파일 이름을 사용하고 있다고 가정하면 결과를 파이핑하는 ls것도 sed가능합니다.

답변3

${VAR%PATTERN}마지막 필드에 해당하는 접미사를 제거한 다음 ${NEWVAR##PATTERN}마지막 남은 필드를 제외한 모든 필드에 해당하는 접두사를 제거하는 데 사용됩니다 .

all_but_last_field=${mystring%.*}
second_to_last_field=${all_but_last_field##*.}

문자열을 변수에 저장하고 중간 결과를 변수에 저장해야 합니다. 확장 기능을 직접 연결할 수 없습니다(zsh에서는 가능하지만 bash에서는 가능하지 않음).

답변4

다음 파일이 있다고 가정합니다.

ls foo*|awk -F. '{$3 인쇄}'

관련 정보