Como posso reverter a primeira parte de uma frase?

5

Eu sei que posso reverter qualquer frase: echo "a,b,c,d" | rev

mas e se eu quiser reverter apenas a primeira parte de uma frase, tentei fazer isso:

echo "a,b,c,d Access" | rev

e eu entendo isso:

sseccA d,c,b,a , e o que eu realmente quero é:

d,c,b,a Access

Como posso fazer isso?

    
por user79550 03.08.2014 / 21:40

6 respostas

8

Uma maneira é usar read para dividir a linha na primeira palavra e o resto, depois chamar rev somente na primeira palavra

$ echo "a,b,c,d Access" | { read -r first rest; printf '%s %s\n' "$(rev <<< "$first")" "$rest"; }
d,c,b,a Access
    
por 03.08.2014 / 22:07
4

com sed :

sed 's/^/ /;:1
     s/^\([^ ]*\) \([^ ]\)/ /;t1
     s/ //'

com perl :

perl -pe 's/\S+/reverse $&/e'

com zsh :

string='a,b,c,d Access'
setopt extendedglob
result=${string/(#m)[^ ]#/${(j::)${(Oas::)MATCH}}}
    
por 03.08.2014 / 22:19
3

Usando pee (tee pipe) de moreutils ( apt-get install moreutils ):

echo -n "a,b,c,d Access" | pee "cut -d ' ' -f 1 | rev" "cut -d ' ' -f 2" | tr '\n' ' '

O resultado é d,c,b,a Access com um espaço à direita, que vem de uma nova linha traduzida.

    
por 03.08.2014 / 22:04
2

Dependendo do Resposta de Neven :

Você pode fazer isso usando este script de shell:

#!/bin/bash
secondPart='echo "a,b,c,d Access" | awk '{print $2} ''
firstPart='echo "a,b,c,d Access" | awk '{print $1} '| awk -F , '{print $4","$3","$2","$1""}''
echo "$firstPart $secondPart"

na linha de comando, basta digitar:

sh yourShellscript.sh

ou usando uma linha de comando como Jidder sugerido:

awk '$1=gensub(/(.),(.),(.),(.)/,"\4,\3,\2,\1","g",$1)' <<< "a,b,c,d Access"
    
por 03.08.2014 / 22:02
1

Uma solução perl :

$ echo "a,b,c,d Access" | perl -anle 'print ~~reverse($F[0])," @F[1..$#F]"'
d,c,b,a Access
    
por 04.08.2014 / 04:37
1

Aviso justo: isso depende de suas vírgulas.

echo "a,b,c,d Access" | tr ,\  '[\n*]' | 
sed '1!G;$s/\n/,/g;s/\([^,]*\),\(.*\)/ /p;h;d'

OUTPUT

d,c,b,a Access

É meio longo - mais longo do que precisa ser. É mais fácil assim:

set -f ; IFS=,\                                                                 
set -- ${0+a,b,c,d Access}
while [ -n "${2+?}" ]
do  r="$1,$r" 
shift ; done    
echo "${r%,} $1"

OUTPUT

d,c,b,a Access

Ainda meio longo, mas pelo menos faz sentido. É um pouco mais fácil com uma função porque você obtém uma matriz de shell. Como:

rev() ( i=
    set -f ; IFS=$1 ; shift ; set -- $*
    until [ "$((i=${i:=($#+1)}-1))" -eq 0 ]
    do  [ "$i" -gt 1 ] && s=$IFS || s=                                          
        eval printf '"%s$s"' \""\$$i"\"
    done
)
rev , a,b,c,d && echo \ Access

OUTPUT

d,c,b,a Access

Ou se você tiver em uma variável:

var="a,b,c,d Access"
rev , "${var% *}" && echo " ${var##* }"

OUTPUT

d,c,b,a Access
    
por 04.08.2014 / 06:00

Tags