当字符串中有多个字符时,如何仅更改字符串中的一个字符?

Ton*_*tte 2 bash shell-script

我需要编写一个脚本来将电话号码从 123-123-1234 转换为 (123) 123-1234 和 1231231234。我可以使用 tr 命令更改连字符的所有实例,但如何仅更改两个中的一个?我用这段代码做了第二部分

echo "Enter phone number (xxx-xxx-xxxx)"
read phone
echo $phone | cat > phone
tr -d "-" < phone
Run Code Online (Sandbox Code Playgroud)

我知道有更好的方法,但我是一个新学生,只是还不知道,在此先感谢您的帮助

Kam*_*ski 5

标题(“当字符串中有多个字符时,如何仅更改一个字符?”)是您尝试的解决方案,但实际问题在问题正文中进行了解释。比较XY 问题。我的回答是针对身体的。


IFS=- read n1 n2 n3
Run Code Online (Sandbox Code Playgroud)

这将填充n1n2n3与用户输入的片段变量; 分别:

  • 在第一个之前-
  • 在第一个-和第二个之间-
  • 在第二个之后-(包括剩余的-字符,如果有的话)。

然后你可以用printf你想要的任何格式打印它们,例如

printf '(%s) %s-%s\n' "$n1" "$n2" "$n3"
printf '%s%s%s\n' "$n1" "$n2" "$n3"
Run Code Online (Sandbox Code Playgroud)

您可能希望在您接受的内容方面保持自由,而不需要严格的格式。一个作为shell函数的例子:

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
}
Run Code Online (Sandbox Code Playgroud)

调用get_phone_number. 如果函数成功,则使用$n1, $n2and $n3with printf(如上)或以任何您想要的方式。