Comment supprimer les espaces blancs avec sed?

j'ai un script shell simple qui supprime les espaces vides d'un fichier. Y a-t-il un moyen de rendre ce script plus compact (sans créer de fichier temporaire)?

sed 's/[ t]*$//'  > __.tmp
cat __.tmp > 
rm __.tmp
81
demandé sur kenorb 2010-12-14 13:44:21

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.

125
répondu codaddict 2018-03-16 21:38:48

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:]]*$//' ""
52
répondu acrollet 2015-05-01 19:45:25

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]*$//' ""
17
répondu Viktor 2015-05-02 11:13:10

il est préférable de citer aussi $1:

sed -i.bak 's/[[:blank:]]*$//' ""
11
répondu Scrutinizer 2013-03-14 19:46:08
var1="\t\t Test String trimming   "
echo $var1
Var2=$(echo "${var1}" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
echo $Var2
4
répondu Sandip Patel - SM 2013-04-03 13:26:28

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
1
répondu David Tonhofer 2013-11-12 12:15:13

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
}
1
répondu Pascal T. 2015-04-04 14:30:22

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
1
répondu yolenoyer 2017-04-16 09:49:50

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"
-1
répondu phk 2016-03-02 11:32:58