#!/bin/sh에서 문자열 변환

#!/bin/sh에서 문자열 변환

안녕하세요, 이 출력이 있습니다

[4251][7c3c]

나는 얻어야 해

517C3C

나는 노력했다

decodeSerial() {
    serial=$1 
    #serial=$serial | sed -r 's/(\[|\])//g'
    #serial=$serial | sed 's/]//'
    #serial=$serial | tr a-z A-Z
    serial=${serial: -6}
    echo $serial
}

마지막 6자만 제대로 작동합니다.

답변1

$ echo '[4251][7c3c]' | tr -d '[]' | tr '[:lower:]' '[:upper:]' | cut -c 3-
517C3C

기능으로는:

decodeSerial () {
    printf '%s\n' "$1" |
    tr -d '[]' |
    tr '[:lower:]' '[:upper:]' |
    cut -c 3-
}

이 파이프는 입력에서 [및 문자를 모두 제거하고 ], 모든 소문자를 대문자로 변환하고, 결과에서 처음 두 문자를 삭제합니다.


단일 호출의 경우 (알파벳 문자는 까지 sed의 16진수라고 가정 ):af

$ echo '[4251][7c3c]' | sed 's/[][]//g; y/abcdef/ABCDEF/; s/^..//'
517C3C

처음 2자를 제거하는 대신 마지막 6자를 유지하려면 sed이 호출을 다음과 같이 변경할 수 있습니다.

sed 's/[][]//g; y/abcdef/ABCDEF/; s/^.*\(.\{6\}\)$/\1/'

사용 awk:

$ echo '[4251][7c3c]' | awk '{ gsub("[][]", ""); print toupper(substr($1,3)) }'
517C3C

awk함수 내에서 명령을 사용하십시오( sed위 명령도 비슷한 방식으로 삽입할 수 있습니다).

decodeSerial () {
    printf '%s\n' "$1" |
    awk '{ gsub("[][]", ""); print toupper(substr($1,3)) }'
}

awk쉘 함수에서 파이프를 사용하지 않을 때 사용:

decodeSerial () {
    awk -v string="$1" 'BEGIN { gsub("[][]", "", string); print toupper(substr(string,3)) }'
}

${serial: -6}is 구문 은 bash에 적용되지 않을 수 있습니다 /bin/sh.

답변2

bash로 이것을 할 수 있습니다문자열 연산:

serial='[4251][7c3c]' ; serial="${serial//[/}" ; serial="${serial//]/}" ; echo "${serial: -6}"

아니면 함수로

decodeSerial () {
  serial="$1"
  serial="${serial//[/}"
  serial="${serial//]/}"
  printf '%s\n' "${serial: -6}"
}

관련 정보