web-dev-qa-db-fra.com

Y a-t-il un moyen d'utiliser la commande TR en place?

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?

8
user199046

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).

3
terdon

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.

2
Stéphane Chazelas