![문자열에서 점으로 구분된 요소의 순서를 반대로 바꿉니다.](https://linux55.com/image/92061/%EB%AC%B8%EC%9E%90%EC%97%B4%EC%97%90%EC%84%9C%20%EC%A0%90%EC%9C%BC%EB%A1%9C%20%EA%B5%AC%EB%B6%84%EB%90%9C%20%EC%9A%94%EC%86%8C%EC%9D%98%20%EC%88%9C%EC%84%9C%EB%A5%BC%20%EB%B0%98%EB%8C%80%EB%A1%9C%20%EB%B0%94%EA%BF%89%EB%8B%88%EB%8B%A4..png)
다음과 같은 입력 문자열이 있습니다.
arg1.arg2.arg3.arg4.arg5
내가 원하는 출력은 다음과 같습니다.
arg5.arg4.arg3.arg2.arg1
매개변수가 항상 5개인 것은 아니며 2~10개일 수도 있습니다.
Bash 스크립트에서 이 작업을 어떻게 수행할 수 있나요?
답변1
tr
tac
++ 조합을 사용하세요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'