Je veux supprimer tous les alphanméristes non anglais d'un fichier.
tr -sc '[:alnum:][:punct:]' ' ' <file
gawk
et sed
avoir le -i
Drapeau mais je ne trouve rien de même dans les pages tr
man.
Comment puis-je faire cela sur place, c'est-à-dire stocker la sortie dans le fichier d'entrée lui-même?
Non, très peu de commandes ont cette fonctionnalité, GNU AWK (gawk
) l'a ajouté récemment et même pour ces commandes qui ont un -i
ou équivalent, tout ce qu'il fait est de créer un fichier temporaire en arrière-plan.
Donc, la façon de faire c'est:
tr -sc '[:alnum:][:punct:]' ' ' <file >newfile && mv newfile file
Vous pouvez préparer une petite fonction si vous en avez besoin souvent:
tri(){
tmpFile=$(mktemp)
echo "$@"
case $# in
## You've given tr options
4)
trOpts="$1"
set1="$2"
set2="$3"
inputFile="$4"
;;
## No options, only set1 and set2 and the input file
3)
set1="$1"
set2="$2"
inputFile="$3"
;;
## Something wrong
*)
echo "Whaaaa?"
exit 1
;;
esac
tr "$trOpts" "$set1" "$set2" < "$inputFile" > "$tmpFile" &&
mv "$tmpFile" "$inputFile"
}
Vous pourriez alors courir cela comme suit:
tri -sc '[:alnum:][:punct:]' ' ' file
Notez comment, contrairement à la réelle tr
, cela s'attend à ce que le nom du fichier sous forme d'argument et non comme entrée redirigée (<file
), et que les options soient spécifiées ensemble comme indiqué ci-dessus (et pas comme -s -c
).
Cette commande tr
_ écrit toujours au plus autant de données que celle indiquée, elle devrait être en sécurité pour qu'elle écrive sa sortie en place:
Avec le ksh93
Coquille:
tr -sc '\n[:alnum:][:punct:]' '[ *]' < file 1<>; file
(Ici converti en syntaxe standard/posix [ *]
et ajouter de nouvelles lignes à la liste des caractères à préserver pour éviter de créer une sortie non-texte).
Les 1<>;
L'opérateur spécifique KSH93 est comme la norme 1<>
Lire + écriture-sans-troncature, sauf que lors de la réalisation réussie de la commande soit redirigée, le fichier est tronqué à la position actuelle.