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/'
^
ni $
parce que sed prend le plus grand nombre possible par défaut (donc toute la ligne) *
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.