文字列に複数の文字がある場合、その文字のみを変更する方法はありますか?

文字列に複数の文字がある場合、その文字のみを変更する方法はありますか?

電話番号を123-123-1234から(123)123-1234および1231231234に変換するスクリプトを作成する必要があります。 trコマンドを使用してハイフンのすべてのインスタンスを変更できますが、どちらか一方を変更するにはどうすればよいですか?このコードで2番目の部分を実行しました。

echo "Enter phone number (xxx-xxx-xxxx)"
read phone
echo $phone | cat > phone
tr -d "-" < phone

より良い方法があることを知っていますが、私は新入生であり、まだそれを知りません。助けてくれてありがとう。

ベストアンサー1

タイトル(「複数の文字があるときに文字列の文字を変更する方法」)は試したソリューションですが、実際の問題は質問の本文に記載されています。比較するXYの問題。私の答えは体についてです。


IFS=- read n1 n2 n3

これはそれぞれユーザー入力n1n2変数のフラグメントで埋められます。n3

  • 最初の前に-
  • 最初-と2番目の間-
  • 2文字目以降-(残りの-文字を含む)。

printfその後、任意の形式で印刷できます。

printf '(%s) %s-%s\n' "$n1" "$n2" "$n3"
printf '%s%s%s\n' "$n1" "$n2" "$n3"

欲しいかもしれませんあなたが受け入れるものに対して自由に行動します。そして厳格なフォーマットは必要ありません。シェル機能の例:

get_phone_number() {
   IFS= read -rp "Enter phone number (10 digits; additional dashes, spaces, whatever allowed): " p || return 1
   # remove non-digits
   p="$(tr -dc '0123456789' <<< "$p")"
   # check if there is 10 of them
   if [ "${#p}" -ne 10 ]; then
      echo "Wrong number of digits. Aborting." >&2; return 2
   else
      n1="${p:0:3}"
      n2="${p:3:3}"
      n3="${p:6:4}"
   fi
}

を呼び出しますget_phone_number。関数が成功したら、上記のように、または目的の方法でおよびを$n1使用します。$n2$n3printf

おすすめ記事