Une commande sed pour échanger le premier et le dernier caractère de chaque ligne

Je veux écrire une commande sed à un seul trait pour échanger le premier et le dernier caractère de chaque ligne de fichier. La commande ci-dessous ne fonctionne pas

sed 's/\(.\)\(.+\)\(.\)/\3\2\1/' input.txt 

J’ai même essayé d’append des caractères de début de ligne et de fin de ligne

  sed 's/^\(.\)\(.+\)\(.\)$/\3\2\1/' input.txt 

Cela ne semble pas correspondre à quoi que ce soit dans le fichier.

Vous devez échapper au + ,

 sed 's/^\(.\)\(.\+\)\(.\)$/\3\2\1/' input.txt 
 sed -E 's/(.)(.+)(.)/\3\2\1/' input.txt 

Si vous aimez essayer un autre, voici une version de gnu awk

 awk '{a=$1;$1=$NF;$NF=a}1' FS= OFS= input.txt 

Cela définit a au premier caractère, puis définit d’abord pour durer et durer jusqu’à a
Il a besoin de gnu awk , car les réglages de FS à rien ne sont pas standard awk

Cela fonctionne portable:

 abcd | sed 's/^\(.\)\(.*\)\(.\)$/\3\2\1/' 

vous pouvez utiliser le .* . Des tirages

 dbca 

travaille également avec l’ ad aussi, comme

 echo ad | sed 's/^\(.\)\(.*\)\(.\)$/\3\2\1/' 

estampes

 da 

Le .+ N’est pas connu pour chaque sed par exemple il ne fonctionnait pas sous OS X. Par conséquent, je recommande d’utiliser .* Ou de simuler le .+ Avec ..* , comme

 echo ad | sed 's/^\(.\)\(..*\)\(.\)$/\3\2\1/' 

estampes

 ad #not swaps 
 echo 'are' | sed 's/\(.\)\(.*\)\(.\)/\3\2\1/' 
  • Pas besoin de ^ ni $ parce que sed prend le plus grand nombre possible par défaut (donc toute la ligne)
  • utilisez * au lieu de + car avec le + vous avez besoin d’au moins une ligne de 3 caractères pour travailler avec une ligne de 2 caractères devant toujours échanger le début et la fin.