문자열에서 점으로 구분된 요소의 순서를 반대로 바꿉니다.

문자열에서 점으로 구분된 요소의 순서를 반대로 바꿉니다.

다음과 같은 입력 문자열이 있습니다.

arg1.arg2.arg3.arg4.arg5

내가 원하는 출력은 다음과 같습니다.

arg5.arg4.arg3.arg2.arg1

매개변수가 항상 5개인 것은 아니며 2~10개일 수도 있습니다.

Bash 스크립트에서 이 작업을 어떻게 수행할 수 있나요?

답변1

  • trtac++ 조합을 사용하세요paste

    $ tr '.' $'\n' <<< 'arg1.arg2.arg3.arg4.arg5' | tac | paste -s -d '.'
    arg5.arg4.arg3.arg2.arg1
    
  • 여전히 bash를 선호한다면 이렇게 할 수 있습니다.

    IFS=. read -ra line <<< "arg1.arg2.arg3.arg4."
    let x=${#line[@]}-1; 
    while [ "$x" -ge 0 ]; do 
          echo -n "${line[$x]}."; 
          let x--; 
    done
    
  • 사용 perl,

    $ echo 'arg1.arg2.arg3.arg4.arg5' | perl -lne 'print join ".", reverse split/\./;'
    arg5.arg4.arg3.arg2.arg1
    

답변2

조금이라도 괜찮다면 python:

".".join(s.split(".")[::-1])

예:

$ python3 -c 's="arg1.arg2.arg3.arg4.arg5"; print(".".join(s.split(".")[::-1]))'
arg5.arg4.arg3.arg2.arg1
  • s.split(".").구분된 하위 문자열을 포함하는 목록을 생성하고, [::-1]목록을 반전하고, ".".join()반전된 목록의 구성 요소를 와 결합합니다 ..

답변3

sed한 번의 호출로 이 작업을 수행 할 수 있습니다 .

sed -E 'H;g;:t;s/(.*)(\n)(.*)(\.)(.*)/\1\4\5\2\3/;tt;s/\.(.*)\n/\1./'

이는 홀딩 버퍼를 사용하여 패턴 공간에서 선행 개행 문자를 가져오고 이를 사용하여 개행 문자 뒤에 더 이상 점이 올 때까지 순열합니다. 이 시점에서 패턴 공간에서 선행 점을 제거하고 개행 문자를 다음으로 바꿉니다. 점.
BRE와 약간 다른 정규식 사용:

sed 'H
g
:t
s/\(.*\)\(\n\)\(.*\)\(\.\)\(.*\)/\1\4\5\2\3/
tt
s/\(\.\)\(.*\)\n/\2\1/'

입력에 여러 줄이 포함되어 있고 각 줄의 순서를 바꾸려는 경우:

sed -E 'G;:t;s/(.*)(\.)(.*)(\n)(.*)/\1\4\5\2\3/;tt;s/(.*)\n(\.)(.*)/\3\2\1/'

답변4

SED 솔루션:

sed 's/\./\n/g' yourFile | tac | sed ':a; $!{N;ba};s/\n/./g'

관련 정보