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 .
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:]]\+$//' {} \+
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,\}$//' {} \+
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 {} +
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:
[:space:]
), donc cela fonctionne très bien sur les fichiers de style Windows/DOS.file
pense être un fichier texte.Que dis-tu de ça:
sed -e -i 's/[ \t]*$//'
Btw, ceci est un site pratique: http://sed.sourceforge.net/sed1line.txt
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:
Pour supprimer les espaces de fin, vous pouvez les utiliser tels quels:
$ node sed.js "/^[\t ]*$/gm" "" file
Prendre plaisir
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?
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