Comment supprimer les espaces blancs avec sed?
9 réponses
vous pouvez utiliser l'option -i
de sed
pour Linux et Unix:
sed -i 's/[ \t]*$//' ""
attention, l'expression supprimera la suite t
sur OSX (vous pouvez utiliser gsed
pour éviter ce problème). Il peut les supprimer sur BSD aussi.
si vous n'avez pas gsed, voici la syntaxe correcte (mais difficile à lire) de sed sur OSX:
sed -i '' -E 's/[ '$'\t'']+$//' ""
trois cordes mono-citées deviennent finalement concaténées en un seul argument / expression. Il n'y a pas d'opérateur de concaténation à bash, il suffit de placer les cordes l'une après l'autre sans espace entre les deux.
le $'\t'
se résout comme un caractère d'onglet littéral dans bash (en utilisant ANSI-C citant ), de sorte que l'onglet est correctement concaténé dans l'expression.
au moins sur Mountain Lion, la réponse de Viktor supprimera également le caractère 't' quand il est à la fin d'une ligne. Les correctifs suivants question:
sed -i '' -e's/[[:space:]]*$//' ""
merci à codaddict pour avoir suggéré l'option -i
.
la commande suivante résout le problème du léopard des Neiges
sed -i '' -e's/[ \t]*$//' ""
il est préférable de citer aussi $1:
sed -i.bak 's/[[:blank:]]*$//' ""
var1="\t\t Test String trimming "
echo $var1
Var2=$(echo "${var1}" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
echo $Var2
Juste pour le fun:
#!/bin/bash
FILE=
if [[ -z $FILE ]]; then
echo "You must pass a filename -- exiting" >&2
exit 1
fi
if [[ ! -f $FILE ]]; then
echo "There is not file '$FILE' here -- exiting" >&2
exit 1
fi
BEFORE=`wc -c "$FILE" | cut --delimiter=' ' --fields=1`
# >>>>>>>>>>
sed -i.bak -e's/[ \t]*$//' "$FILE"
# <<<<<<<<<<
AFTER=`wc -c "$FILE" | cut --delimiter=' ' --fields=1`
if [[ $? != 0 ]]; then
echo "Some error occurred" >&2
else
echo "Filtered '$FILE' from $BEFORE characters to $AFTER characters"
fi
j'ai un script dans mon .bashrc qui fonctionne sous OSX et Linux (bash seulement !)
function trim_trailing_space() {
if [[ $# -eq 0 ]]; then
echo "$FUNCNAME will trim (in place) trailing spaces in the given file (remove unwanted spaces at end of lines)"
echo "Usage :"
echo "$FUNCNAME file"
return
fi
local file=
unamestr=$(uname)
if [[ $unamestr == 'Darwin' ]]; then
#specific case for Mac OSX
sed -E -i '' 's/[[:space:]]*$//' $file
else
sed -i 's/[[:space:]]*$//' $file
fi
}
à laquelle j'ajoute:
SRC_FILES_EXTENSIONS="js|ts|cpp|c|h|hpp|php|py|sh|cs|sql|json|ini|xml|conf"
function find_source_files() {
if [[ $# -eq 0 ]]; then
echo "$FUNCNAME will list sources files (having extensions $SRC_FILES_EXTENSIONS)"
echo "Usage :"
echo "$FUNCNAME folder"
return
fi
local folder=
unamestr=$(uname)
if [[ $unamestr == 'Darwin' ]]; then
#specific case for Mac OSX
find -E $folder -iregex '.*\.('$SRC_FILES_EXTENSIONS')'
else
#Rhahhh, lovely
local extensions_escaped=$(echo $SRC_FILES_EXTENSIONS | sed s/\|/\\\|/g)
#echo "extensions_escaped:$extensions_escaped"
find $folder -iregex '.*\.\('$extensions_escaped'\)$'
fi
}
function trim_trailing_space_all_source_files() {
for f in $(find_source_files .); do trim_trailing_space $f;done
}
pour ceux qui recherchent l'efficacité (beaucoup de fichiers à traiter, ou d'énormes fichiers), l'utilisation de l'opérateur de répétition +
au lieu de *
rend la commande plus que deux fois plus rapide.
avec GNU sed:
sed -Ei 's/[ \t]+$//' ""
sed -i 's/[ \t]\+$//' "" # The same without extended regex
j'ai aussi rapidement comparé quelque chose d'autre: utiliser [ \t]
au lieu de [[:space:]]
accélère aussi considérablement le processus (GNU sed v4.4):
sed -Ei 's/[ \t]+$//' ""
real 0m0,335s
user 0m0,133s
sys 0m0,193s
sed -Ei 's/[[:space:]]+$//' ""
real 0m0,838s
user 0m0,630s
sys 0m0,207s
sed -Ei 's/[ \t]*$//' ""
real 0m0,882s
user 0m0,657s
sys 0m0,227s
sed -Ei 's/[[:space:]]*$//' ""
real 0m1,711s
user 0m1,423s
sys 0m0,283s
Pour enlever seulement les espaces blancs (dans mes espaces et onglets) des lignes avec au moins un caractère non-blanc (de cette façon les lignes en retrait vides ne sont pas touchées):
sed -i -r 's/([^ \t]+)[ \t]+$//' "$file"