こんにちは、この出力があります
[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-
}
このパイプは入力から[
文字をすべて削除し]
、すべての小文字を大文字に変換し、結果から最初の2文字を削除します。
単一呼び出しの場合(アルファベット文字はまで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}"
}