#!/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-
}

このパイプは入力から[文字をすべて削除し]、すべての小文字を大文字に変換し、結果から最初の2文字を削除します。


単一呼び出しの場合(アルファベット文字はまで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}"
}

関連情報