次のような文字列があります。
391c294eb646cd0f3068cc7ba945071d04327b0ccb181d901466ee3d79c6fe69#3640345
私はそれが次のように見えるようにしたいです:
391c-294eb646cd0f3068cc7ba945071d04327b0ccb181d901466ee3d79c6fe69
ご覧のとおり、最初の4文字の後にハイフンを追加してから、文字列から#
その後のすべての文字を削除したいと思います。
答え1
ここでは、正規表現の一致を使用するのが役立ちます。
str='391c294eb646cd0f3068cc7ba945071d04327b0ccb181d901466ee3d79c6fe69#3640345'
[[ "$str" =~ (.{4})([^#]+) ]] && new="${BASH_REMATCH[1]}-${BASH_REMATCH[2]}"
echo "$new"
391c-294eb646cd0f3068cc7ba945071d04327b0ccb181d901466ee3d79c6fe69
これBASH_REMATCH
配列は正規表現のキャプチャ部分を保持し、インデックス 0 は正規表現全体に一致する入力部分を保持します。
答え2
パラメータ拡張を使用します。
#!/bin/bash
expected=391c-294eb646cd0f3068cc7ba945071d04327b0ccb181d901466ee3d79c6fe69
input='391c294eb646cd0f3068cc7ba945071d04327b0ccb181d901466ee3d79c6fe69#3640345'
result=${input%#*} # Remove everything starting with the last #.
result=${result:0:4}-${result:4} # Insert the dash.
[[ $result == $expected ]] && echo ok
最初の#が必要な場合はを使用してください${input%%#*}
。