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
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?
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}}}
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.
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"
Uma solução perl
:
$ echo "a,b,c,d Access" | perl -anle 'print ~~reverse($F[0])," @F[1..$#F]"'
d,c,b,a Access
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'
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"
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
d,c,b,a Access
Ou se você tiver em uma variável:
var="a,b,c,d Access"
rev , "${var% *}" && echo " ${var##* }"
d,c,b,a Access
Tags shell