!/빈/배시

!/빈/배시

대학 과제를 하려고 하는데 현재 막혔습니다. 목표는 전화번호 몇 개를 읽고 처음 3자리 숫자의 순서를 뒤집어서 괄호 안에 넣는 것입니다. 전화번호를 읽을 수는 있지만 숫자는 읽을 수 없습니다.

예를 들면 다음과 같습니다.

214 4234-5555

예: 출력

412 4234-5555

이것이 내가 지금까지 가지고 있는 것입니다

sed -r "s/([0-9]), ([0-9]), ([0-9])/\3\2\1/g" phone.txt

답변1

OP의 시도 수정

$ cat ip.txt
214 4234-5555
foo 123 4533-3242

$ sed -r 's/([0-9])([0-9])([0-9])/\3\2\1/' ip.txt
412 4234-5555
foo 321 4533-3242

$ # adding parenthesis as well
$ sed -r 's/([0-9])([0-9])([0-9])/(\3\2\1)/' ip.txt
(412) 4234-5555
foo (321) 4533-3242

$ # if ERE is not supported
$ sed 's/\([0-9]\)\([0-9]\)\([0-9]\)/(\3\2\1)/' ip.txt
(412) 4234-5555
foo (321) 4533-3242
  • 일부 sed구현 에서는 -E대신 필요합니다.-r
  • 보간이 필요하지 않으면 작은따옴표를 사용하십시오.https://mywiki.wooledge.org/Quotes
  • ([0-9]), ([0-9]), ([0-9])쉼표와 공백으로 구분된 3자리 숫자와 일치합니다.
  • g해당 줄의 모든 항목을 변경하려면 수정자가 필요합니다.


일반적인 솔루션의 경우 반전할 자릿수를 숫자 인수로 정의합니다.

$ perl -pe 's/\d{3}/reverse $&/e' ip.txt
412 4234-5555
foo 321 4533-3242
$ perl -pe 's/\d{3}/sprintf "(%s)", scalar reverse $&/e' ip.txt
(412) 4234-5555
foo (321) 4533-3242

답변2

이것은 길고 복잡하며 불필요한 내용일 수도 있지만 sed여전히 흥미롭습니다.

sed -re 'h;    s/^([0-9]*) *(.*)/\1\n/;  :1 s/(.)(.*\n)/\2\1/;t1;  s/.//;  s/^(.*)$/\(\1\)/; x;s/([0-9]{3})(.*)/\2/;x;G;s/\n//'

작동 방식은 다음과 같습니다.

      # pretend 214 4234-5555 is the current line
h;    # copy the current line into hold space
s/^([0-9]*) *(.*)/\1\n/;  # keep only first 3 numbers, 214
:1 s/(.)(.*\n)/\2\1/;t1;  s/.//;  # reversing string in sed, 
                                  # see notes below; 214 becomes 412
s/^(.*)$/\(\1\)/;  # After string is reversed, add brackets; (412)
x;s/([0-9]{3})(.*)/\2/; # swap hold and pattern buffer, 
                        # delete first 3 chars; 
                        # pattern space now is <space>4234-5555

x;G;s/\n// # swap again, append hold buffer to pattern buffer; 
            # now pattern buffer is (412)<newline> 4234-5555; 
            # finally delete newline; we get (412) 4234-5555

실제 모습은 다음과 같습니다.

$ printf "214 4234-5555\n123 3333\n" | sed -re 'h;    s/^([0-9]*) *(.*)/\1\n/;  :1 s/(.)(.*\n)/\2\1/;t1;  s/.//;  s/^(.*)$/\(\1\)/; x;s/([0-9]{3})(.*)/\2/;x;G;s/\n//'
(412) 4234-5555
(321) 3333

노트:문자열 반전은 원래 다음에서 발견되었습니다.Stephen Chazeras의 검토

답변3

방법 1

다음 방법을 사용하여 동일한 결과를 얻습니다.

i=`awk '{print $1}' example.txt| rev`
awk -v i="$i" '{print i,$2}' example.txt

산출

412 4234-5555

방법 2

sed  's/\(.\)\(.\)\(.\)/\3\2\1/' example.txt

산출

412 4234-5555

답변4

Phone.txt의 번호가 "xxx xxx-xxxx"인 경우 다음을 사용할 수 있습니다.

!/빈/배시

echo '('$(catphone.txt | cut -d ' ' -f1 | rev)')'

관련 정보