web-dev-qa-db-fra.com

commande sed pour remplacer plusieurs espaces en espaces simples

J'ai essayé de remplacer plusieurs espaces d'un fichier par un seul espace à l'aide de sed.

Mais il divise chaque personnage comme ci-dessous . S'il vous plaît laissez-moi savoir quel est le problème ...

$ cat test.txt
 iiHi Hello   Hi
this   is   loga

$

$ cat test.txt | tr [A-Z] [a-z]|sed -e "s/ */ /g"
 i i h i h e l l o h i
 t h i s i s l o g a 
11
logan

Votre commande sed fait le mauvais choix car elle correspond à "zéro ou plusieurs espaces", ce qui se produit bien sûr entre chaque paire de caractères! Au lieu de s/ */ /g, vous voulez s/ */ /g ou s/ +/ /g.

16
John Zwinck

En utilisant tr, l'option -s réduira les caractères consécutifs en un seul:

tr -s '[:space:]' < test.txt
 iiHi Hello Hi
this is loga

Pour minimiser également: tr -s '[:space:]' < test.txt | tr '[:upper:]' '[:lower:]'

10
glenn jackman

Vous pouvez utiliser awk pour résoudre ceci:

awk '{$0=tolower($0);$1=$1}1' test.txt
iihi hello hi
this is loga
3
Jotne
sed 's/ \+/ /g' test.txt | tr [A-Z] [a-z]

ou 

sed 's/\s\+/ /g' test.txt | tr [A-Z] [a-z]
1
Amos Baker

Peut-être que vous pouvez faire correspondre l'expression régulière suivante pour plusieurs espaces:

'\s+'

et remplacez par un seul espace comme suit:

' '

0
sshashank124