142 votes

Comment supprimer les blancs de fin de ligne avec sed ?

J'ai un simple shell script qui supprime les espaces blancs de fin de fichier. Existe-t-il un moyen de rendre ce script plus compact (sans créer un fichier temporaire) ?

sed 's/[ \t]*$//' $1 > $1__.tmp
cat $1__.tmp > $1
rm $1__.tmp

208voto

codaddict Points 154968

Vous pouvez utiliser l'option "en place". -i de sed pour Linux et Unix :

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

Sachez que l'expression supprimera les résidus t sur OSX (vous pouvez utiliser gsed pour éviter ce problème). Il se peut qu'il les supprime aussi sur BSD.

Si vous n'avez pas gsed, voici la syntaxe sed correcte (mais difficile à lire) sous OSX :

sed -i '' -E 's/[ '$'\t'']+$//' "$1"

Trois chaînes de caractères entre guillemets sont finalement concaténées en un seul argument/expression. Il n'y a pas d'opérateur de concaténation dans bash, vous placez simplement les chaînes l'une après l'autre, sans espace entre elles.

El $'\t' se résout comme un caractère de tabulation littéral dans bash (en utilisant Cotation ANSI-C ), de sorte que la tabulation est correctement concaténée dans l'expression.

71voto

acrollet Points 191

Au moins sur Mountain Lion, la réponse de Viktor supprimera également le caractère "t" lorsqu'il se trouve à la fin d'une ligne. La solution suivante corrige ce problème :

sed -i '' -e's/[[:space:]]*$//' "$1"

20voto

Viktor Points 795

Merci à codaddict d'avoir suggéré le -i option.

La commande suivante résout le problème sur Snow Leopard

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

14voto

Scrutinizer Points 3311

Il est préférable de citer également 1 $ :

sed -i.bak 's/[[:blank:]]*$//' "$1"

5voto

Pascal T. Points 1376

J'ai un script dans mon .bashrc qui fonctionne sous OSX et Linux (bash uniquement !).

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=$1
  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=$1

  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
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X