web-dev-qa-db-fra.com

Comment supprimer les espaces blancs de début et de fin?

J'utilise awk '{gsub(/^[ \t]+|[ \t]+$/,""); print;}' in.txt > out.txt pour supprimer les espaces blancs de début et de fin.

Le problème est que le fichier de sortie contient des espaces de fin! Toutes les lignes ont la même longueur - elles sont complétées à droite par des espaces.

Qu'est-ce que je rate?

MISE À JOUR 1

Le problème est probablement dû au fait que les espaces de fin ne sont ni des espaces "normaux" mais\x20 caractères (DC4).

MISE À JOUR 2

J'ai utilisé gsub (/'[[:cntrl:]]|[[:space:]]|\x20/,"") et cela a fonctionné. Deux choses étranges:

  1. Pourquoi\x20 n'est-il pas considéré comme un caractère de contrôle?

  2. Utiliser '[[:cntrl:][:space:]\x20 ne fonctionne PAS. Pourquoi?

13
user1194552

Cette commande fonctionne pour moi:

$ awk '{$1=$1}1' file.txt
25
kev

Votre code me convient.
Vous pouvez avoir autre chose que space et tabulation...
hexdump -C peut vous aider à vérifier ce qui ne va pas:

awk '{gsub(/^[ \t]+|[ \t]+$/,""); print;}' in.txt | hexdump -C | less

METTRE À JOUR:

OK, vous avez identifié DC4 (il peut y avoir d'autres caractères de contrôle ...)
Ensuite, vous pouvez améliorer votre commande:

awk '{gsub(/^[[:cntrl:][:space:]]+|[[:cntrl:][:space:]]+$/,""); print;}' in.txt > out.txt

Voir la page de manuel awk:

[:alnum:] Alphanumeric characters.
[:alpha:] Alphabetic characters.
[:blank:] Space or tab characters.
[:cntrl:] Control characters.
[:digit:] Numeric characters.
[:graph:] Characters that are both printable and visible. (A space is printable, but not visible, while an a is both.)
[:lower:] Lower-case alphabetic characters.
[:print:] Printable characters (characters that are not control characters.)
[:punct:] Punctuation characters (characters that are not letter, digits, control characters, or space characters).
[:space:] Space characters (such as space, tab, and formfeed, to name a few).
[:upper:] Upper-case alphabetic characters.
[:xdigit:] Characters that are hexadecimal digits.

Suppression de 0x20 début/fin

Pour moi, la commande est OK, j'ai testé comme ceci:

$ echo -e "\x20 \tTEXT\x20 \t" | hexdump -C
00000000  20 20 09 54 45 58 54 20  20 09 0a                 |  .TEXT  ..|
0000000b
$ echo -e "\x20 \tTEXT\x20 \t" | awk '{gsub(/^[[:cntrl:][:space:]]+|[[:cntrl:][:space:]]+$/,""); print;}' | hexdump -C
00000000  54 45 58 54 0a                                    |TEXT.|
00000005

Cependant, si vous avez 0x20 au milieu de votre texte 
=> alors il n'est pas supprimé. 
Mais ce n’est pas votre question, n’est-ce pas?

4
olibre

Vos fichiers ont probablement des fins de ligne Windows. Cela signifie qu'ils se terminent par \r\n, ainsi la correspondance d'une séquence d'onglets et d'espaces à la fin de la ligne ne fonctionnera pas - awk tente de faire correspondre tous les onglets et espaces qui viennent après le \r. Essayez d'exécuter le fichier avec tr -d "\r" avant de l'envoyer à awk. 

1
Michael J. Barber

Perl pourrait être utilisé:

Perl -lpe 's/^\s*(.*\S)\s*$/$1/' in.txt > out.txt

s/foo/bar/ substitute en utilisant des expressions régulières
^ début de chaîne
\s* zéro ou plusieurs espaces
(.*\S) tous les caractères se terminant par un non-espace. Capturez-le en 1 $
\s* zéro ou plusieurs espaces
$ fin de chaîne

0
Chris Koknat