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:
Pourquoi\x20 n'est-il pas considéré comme un caractère de contrôle?
Utiliser '[[:cntrl:][:space:]\x20
ne fonctionne PAS. Pourquoi?
Cette commande fonctionne pour moi:
$ awk '{$1=$1}1' file.txt
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
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.
0x20
début/finPour 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?
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.
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