Comment faire pour supprimer attaque et de fuite des espaces?
Je suis en utilisant awk '{gsub(/^[ \t]+|[ \t]+$/,""); print;}' in.txt > out.txt
pour enlever les deux attaque et de fuite des espaces.
Le problème est le fichier de sortie a effectivement la fuite des espaces! Toutes les lignes sont de la même longueur qu'ils sont complétées par des espaces.
Ce qui me manque?
Mise à JOUR de 1
Le problème est probablement en raison du fait que les espaces sont ni "normal" espaces), mais \x20 caractères (DC4).
Mise à JOUR 2
J'ai utilisé gsub (/'[[:cntrl:]]|[[:space:]]|\x20/,"")
un il a travaillé.
Deux choses étranges:
- Pourquoi n'est-ce pas \x20 considéré comme un caractère de contrôle?
- À l'aide de
'[[:cntrl:][:space:]\x20
ne fonctionne PAS. Pourquoi?
Mise à JOUR: peut-être qu'elles ne sont pas de simples espaces, mais DC4 caractères de contrôle? Les fichiers d'origine de Windows.
\x20
est un habitué de l'espace ASCII. Les caractères de contrôle sont \x00
par \x1F
.OriginalL'auteur user1194552 | 2012-02-07
Vous devez vous connecter pour publier un commentaire.
Cette commande fonctionne pour moi:
awk '$1=$1' file.txt
n'est-ce pas?volonté de normaliser une ligne en supprimant les espaces supplémentaires.
$1=$1
déclencher l'action, sinon rien ne se passe.Je pense que vous devriez ajouter à la réponse, avec une explication de ce que le 1 ne.
Le
1
est le même que{print}
. Il permettra d'imprimer toutes les lignes.il ne fonctionne pas avec GNU Awk 3.1.7 sur CentOS 6.5 avec ksh:
echo "foo;bar ">tt && print "_$( awk -F";" -OFS";" '{$2=$2}1' tt)_"
donne_foo;bar _
. Ai-je raté quelque chose ? Quelle est votre configuration, btw ?OriginalL'auteur kev
Votre code est OK pour moi.
Vous peut avoir quelque chose d'autre que
space
ettabulation
...hexdump -C
peut vous aider à vérifier ce qui est faux:Mise à JOUR:
OK vous avez identifié DC4 (il peut y avoir quelques autres caractères de contrôle...)
Ensuite, vous pouvez améliorer votre commande:
Voir
awk
man:[: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.
Avant/après
0x20
suppressionPour moi la commande est OK, j'ai testé comme ceci:
Toutefois, si vous avez
0x20
dans le milieu de votre texte=> alors il n'est pas supprimé.
Mais ce n'est pas à votre question, n'est-ce pas?
même essayé d'ajouter \x20 - ne fonctionne toujours pas. je suis paumé!
Bonjour @user1194552. Veuillez fournir votre
hexdump -C
de sortie avant et aprèsawk
de traitement. Ensuite, je peux mieux comprendre votre problème. Parce que quand j'essaie de le tester, il semble bon pour moi 🙂Qu'est-ce que votre
awk --version
? Je peux tester les deux versions:GNU Awk 3.1.3
etGNU Awk 3.1.5
. Et s'il vous plaît fournir votrehexdump -C
. Ensuite, je peux tester la même chose que vous.OriginalL'auteur olibre
Vos fichiers ont probablement Windows fins de ligne. Cela signifie qu'ils finissent par
\r\n
, donc correspondant à une séquence de tabulations et des espaces à la fin de la ligne ne fonctionne pas -- awk essaie de faire correspondre tous les onglets et les espaces qui viennent après la\r
. Essayez de lancer le fichier par l'intermédiaire detr -d "\r"
avant de l'envoyer à awk.OriginalL'auteur Michael J. Barber
Perl peut être utilisé:
s/foo/bar/
substituer à l'aide d'expressions régulières^
début de chaîne\s*
zéro, un ou plusieurs espaces(.*\S)
tous les caractères se terminant par un non-blanc. Capture dans $1\s*
zéro, un ou plusieurs espaces$
la fin de la chaîneOriginalL'auteur Chris Koknat