전화번호를 123-123-1234에서 (123) 123-1234 및 1231231234로 변환하는 스크립트를 작성해야 합니다. tr 명령을 사용하여 하이픈의 모든 인스턴스를 변경할 수 있지만 둘 중 하나만 변경하려면 어떻게 해야 합니까? 이 코드로 두 번째 부분을 수행했습니다.
echo "Enter phone number (xxx-xxx-xxxx)"
read phone
echo $phone | cat > phone
tr -d "-" < phone
더 좋은 방법이 있다는 것을 알고 있지만 저는 신입생이고 아직 그것을 모릅니다. 도움을 주셔서 미리 감사드립니다.
답변1
제목("두 개 이상의 문자가 있을 때 문자열의 문자를 변경하는 방법")은 시도한 솔루션이지만 실제 문제는 질문 본문에 설명되어 있습니다. 비교하다XY 문제. 내 대답은 신체에 관한 것입니다.
IFS=- read n1 n2 n3
이는 각각 사용자 입력 n1
및 n2
변수 의 조각으로 채워집니다 .n3
- 첫 번째 전에
-
, - 첫 번째
-
와 두 번째 사이-
, - 두 번째 문자 이후
-
(나머지-
문자 포함).
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
$n3
printf
답변2
GNU에서는 sed
대체되어야 하는 패턴의 발생을 한 줄에 지정할 수 있습니다.
첫 번째(기본값)
echo AAAAA | sed 's/A/X/'
XAAAA
모두
echo AAAAA | sed 's/A/X/g'
XXXXX
i번째
echo AAAAA | sed 's/A/X/3'
AAXAA
문제에 대해 이 방법을 사용하려면 두 가지 수정이 필요합니다 sed
. 1) 줄의 시작 부분( ^
)을 변경하여 여는 괄호를 추가하고, 2) 첫 번째 대시를 닫는 괄호와 공백으로 바꿉니다.
echo 123-123-1234 | sed 's/^/(/;s/-/) /'
(123) 123-1234
또는 sed
일치하는 패턴을 허용하고 패턴을 괄호로 묶어서 (발생 횟수 기준) 저장하세요. 출력 문자열에서 숫자로 호출할 수 있습니다.
echo 123-123-1234 | sed 's/\([0-9]\+\)-\([0-9]\+\)-\([0-9]\+\)/(\1) \2-\3/'
(123) 123-1234
이는 [0-9]
0에서 9 사이의 숫자와 일치합니다. \+
즉, 이전 그룹이 한 번 이상 발생하고(GNU 확장자는 sed
) \(<pattern>\)
패턴이 저장되고 인덱스 번호가 부여됩니다(첫 번째 그룹은 1로 시작하는 등). 따라서 \([0-9]\+\)-
하나 이상의 숫자가 일치하고 그 뒤에 대시가 표시되며 숫자 부분이 기억됩니다.
\1
일치하는 첫 번째 저장된 패턴(예 [0-9]\+
: 대시 앞의 숫자)을 출력에 인쇄합니다. 그런 다음 저장된 세 개의 숫자 그룹을 사용하고 필요에 따라 형식을 지정합니다.
답변3
phone
Right 라는 파일을 생성하고 있다는 사실을 알고 계시나요 ? 그리고 파이핑을 할 필요 echo
는 없습니다 cat
. 할 수는 있지만 그렇게 해서는 안 됩니다.echo "$phone" > phone
나는 당신을 위해 다음과 같은 해결책을 생각해 냈습니다. 가장 짧은 방법은 아닐 수도 있지만 다음과 같이 작동합니다.
#!/bin/bash
read -rp "Enter phone number (xxx-xxx-xxxx): " p
area_code=${p:0:3}
prefix=${p:4:3}
line=${p:8:4}
printf '%s\n%s\n' \
"($area_code) ${prefix}-${line}" \
"${area_code}${prefix}${line}"
읽기는 사용자에게 입력을 요청하여 제거 echo
/ read
결합할 수 있습니다.
그런 다음 우리는매개변수 확장전화번호의 세 부분을 꺼내서 필요한 두 가지 형식으로 인쇄하세요.
참고: 이는 어떤 종류의 온전성 검사도 수행하지 않으므로 사용자가 잘못된 입력을 제공할 수 있으며 잘못된 출력을 얻게 됩니다.