단어별로 변수의 내용을 반전시킵니다.

단어별로 변수의 내용을 반전시킵니다.

그래서 변수가 있으면

VAR='10 20 30 40 50 60 70 80 90 100'

그리고 그걸 에코해

echo "$VAR"
10 20 30 40 50 60 70 80 90 100

하지만 스크립트 아래쪽에서 다음과 같은 내용이 표시되도록 해당 변수의 순서를 반대로 바꿔야 합니다.

echo "$VAR" | <code to reverse it>
100 90 80 70 60 50 40 30 20 10

나는 rev를 사용해 보았지만 실제로 모든 것이 반전되었으므로 결과는 다음과 같습니다.

echo "$VAR" | rev
001 09 08 07 06 05 04 03 02 01

답변1

GNU 시스템에서는 cat의 반대말이 tac입니다:

$ tac -s" " <<< "$VAR "            # Please note the added final space.
100 90 80 70 60 50 40 30 20 10

답변2

짧은 목록과 변수의 경우 셸 자체가 가장 빠른 솔루션입니다.

var="10 20 30 40 50 60 70 80 90 100"
set -- $var; unset a 
for ((i=$#;i>0;i--)); do
    printf '%s%s' "${a:+ }" "${!i}"
    a=1
done
echo

산출:

100 90 80 70 60 50 40 30 20 10 

참고: 의 분할 작업은 set -- $var여기에 사용된 정확한 문자열에 대해 안전하지만 문자열에 와일드카드( *, ?또는 )가 포함되어 있으면 []덜 안전합니다 . set -f필요한 경우 분할하기 전에 이를 피할 수 있습니다. 달리 명시하지 않는 한 다음 솔루션에도 동일한 설명이 적용됩니다.

또는 역방향 목록을 사용하여 다른 변수를 설정하려는 경우:

var="10 20 30 40 50 60 70 80 90 100"
set -- $var
for i; do out="$i${out:+ }$out"; done
echo "$out"

아니면 그냥 위치 매개변수를 사용하세요.

var="10 20 30 40 50 60 70 80 90 100"
set -- $var
a=''
for    i
do     set -- "$i${a:+ $@}"
       a=1
done
echo "$1"

아니면 그냥 변수(아마도 var 자체)를 사용하세요.
참고: 이 솔루션은 globbing이나 IFS의 영향을 받지 않습니다.

var="10 20 30 40 50 60 70 80 90 100"

a=" $var"
while [[ $a ]]; do
    printf '<%s>' "${a##* }"
    var="${a% *}"
done

답변3

awk구조하러 오세요

$ var='10 20 30 40 50 60 70 80 90 100'

$ echo "$var" | awk '{for(i=NF; i>0; i--) printf i==1 ? $i"\n" : $i" "}'
100 90 80 70 60 50 40 30 20 10


perl공손 하게IP 주소를 역방향으로 읽는 방법은 무엇입니까?@steeldriver가 공유함

$ echo "$var" | perl -lane '$,=" "; print reverse @F'
100 90 80 70 60 50 40 30 20 10


또는 bash문자열을 배열로 변환하여 자체적으로 사용하십시오.

$ arr=($var)    
$ for ((i=${#arr[@]}-1; i>=0; i--)); do printf "${arr[i]} "; done; echo
100 90 80 70 60 50 40 30 20 10 

답변4

zsh:

print -r -- ${(Oa)=VAR}

$=VAR분할 $VAR기준 $IFS. (Oa)결과 목록을 역배열 순서로 정렬합니다. print -r --(예를 들어) ksh(특정)과 동일합니다.echo -E -zsh신뢰할 수 있는 버전echo: 인수를 있는 그대로 인쇄하고 공백으로 구분하고 개행 문자로 종료합니다.

$IFS포함된 항목(기본적으로 공백, 탭, 줄 바꿈, nul)이 아닌 공백으로만 분할하려는 경우 에 공백을 할당 $IFS하거나 명시적인 분할을 사용합니다. 예를 들면 다음과 같습니다.

print -r -- ${(Oas: :)VAR}

숫자 역순으로 정렬하려면 다음을 수행합니다.

$ VAR='50 10 20 90 100 30 60 40 70 80'
$ print -r -- ${(nOn)=VAR}
100 90 80 70 60 50 40 30 20 10

POSIXly ( 와 함께 사용할 수도 있음 bash):

쉘 내장 기능만 사용하십시오(일부 쉘 제외 printf)(짧은 값을 가진 변수에 더 좋음).

unset -v IFS # restore IFS to its default value of spc, tab, nl
set -o noglob # disable glob
set -- $VAR # use the split+glob operator to assign the words to $1, $2...

reversed_VAR= sep=
for i do
  reversed_VAR=$i$sep$reversed_VAR
  sep=' '
done
printf '%s\n' "$reversed_VAR"

사용 awk(대형 변수, 특히 의 경우 더 좋지만 bash매개변수(또는 단일 매개변수) 크기 제한을 초과하지 않음):

 awk '
   BEGIN {
     n = split(ARGV[1], a);
     while (n) {printf "%s", sep a[n--]; sep = " "}
     print ""
   }' "$VAR"

관련 정보