안녕하세요, 이 출력이 있습니다
[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진수라고 가정 ):a
f
$ 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}"
}