web-dev-qa-db-fra.com

Comment supprimer les espaces de fin pour plusieurs fichiers?

Existe-t-il des outils/des lignes simples UNIX qui supprimeraient les espaces de fin pour plusieurs fichiers sur place.

Par exemple. celui qui pourrait être utilisé en conjonction avec find .

58
Mikko Ohtamaa

Tu veux

sed --in-place 's/[[:space:]]\+$//' file

Cela supprimera tous les espaces blancs définis par POSIX, y compris les tabulations verticales et les formulaires. En outre, il ne fera un remplacement que si l'espace blanc de fin existe réellement, contrairement aux autres réponses qui utilisent le zéro ou plusieurs correspondances (*).

--in-place est simplement la forme longue de -i. Je préfère utiliser le formulaire long dans les scripts, car il tend à être plus illustratif de ce que fait réellement le drapeau.

Il peut être facilement intégré à find comme ceci:

find . -type f -name '*.txt' -exec sed --in-place 's/[[:space:]]\+$//' {} \+

Si vous êtes sur un Mac

Comme indiqué dans les commentaires, ce qui précède ne fonctionne pas si vous n'avez pas installé d'outils GNU. Si tel est le cas, vous pouvez utiliser ce qui suit:

find . -iname '*.txt' -type f -exec sed -i '' 's/[[:space:]]\{1,\}$//' {} \+
127
Tim Pote

Contrairement à d'autres solutions qui nécessitent toutes GNU sed, celle-ci devrait fonctionner sur tout système Unix implémentant des commandes standard POSIX.

find . -type f -name "*.txt" -exec sh -c 'for i;do sed 's/[[:space:]]*$//' "$i">/tmp/.$$ && mv /tmp/.$$ "$i";done' arg0 {} +

Edit: cette version légèrement modifiée conserve les permissions des fichiers:

find . -type f -name "*.txt" -exec sh -c 'for i;do sed 's/[[:space:]]*$//' "$i">/tmp/.$$ && cat /tmp/.$$ > "$i";done' arg0 {} +
13
jlliagre

J'utilise this pour corriger les espaces blancs:

while IFS= read -r -d '' -u 9
do
    if [[ "$(file -bs --mime-type -- "$REPLY")" = text/* ]]
    then
        sed -i -e 's/[ \t]\+\(\r\?\)$/\1/;$a\' -- "$REPLY"
    else
        echo "Skipping $REPLY" >&2
    fi
done 9< <(find . \( -type d -regex '^.*/\.\(git\|svn\|hg\)$' -Prune -false \) -o -type f -print0)

Fonctionnalités:

  • Conserve les retours chariot (contrairement à [:space:]), donc cela fonctionne très bien sur les fichiers de style Windows/DOS.
  • Uniquement les espaces blancs "normaux" - Si vous avez des onglets verticaux ou autres dans vos fichiers, c'est probablement intentionnel (code de test ou données brutes).
  • Ignore les répertoires VCS .git et .svn.
  • Modifie uniquement les fichiers que file pense être un fichier texte.
  • Signale tous les chemins qui ont été ignorés.
  • Fonctionne avec tout nom de fichier .
4
l0b0

Que dis-tu de ça:

sed -e -i 's/[ \t]*$//'

Btw, ceci est un site pratique: http://sed.sourceforge.net/sed1line.txt

1
Kylo

Pour ceux qui ne sont pas des gourous sed (moi y compris), j'ai créé un petit script pour utiliser les expressions régulières JavaScript pour remplacer le texte dans les fichiers et fait le remplacement sur place:

http://git.io/pofQnQ

Pour supprimer les espaces de fin, vous pouvez les utiliser tels quels:

$ node sed.js "/^[\t ]*$/gm" "" file

Prendre plaisir

1
mendezcode

ex

Essayez d'utiliser éditeur Ex (partie de Vim):

$ ex +'bufdo!%s/\s\+$//e' -cxa *.*

Remarque: Pour la récursivité (bash4 & zsh), vous pouvez utiliser ne nouvelle option de globbing (**/*.*). Activer par shopt -s globstar.

Perl

find . -type f -name "*.Java" -exec Perl -p -i -e "s/[ \t]$//g" {} \;

selon Spring Framework Code Style .

sed

Pour utiliser sed, vérifiez: Comment supprimer les espaces de fin avec sed?


Voir aussi: Comment supprimer récursivement les espaces de fin de tous les fichiers?

1
kenorb

Pour une raison quelconque, les commandes sed et Perl ne fonctionnaient pas pour moi. Cela a:

find ./ -type f | rename 's/ +$//g'

Se sent comme le plus simple à lire aussi

0
Indivision Dev