2010-12-10 8 views
0

J'ai un fichier avec plusieurs enregistrements et chaque enregistrement de longueur 100. Dans chaque ligne il y a un segment de longueur de 50 caractères (25-75) qui est réservé à l'état, Pays. Cependant maintenant j'ai besoin que le segment soit State, Country (enlever l'espace entre, et Country) et en même temps maintenir la longueur du champ comme 50.Script UNIX - Déplacement d'un caractère dans chaque ligne d'un fichier

En utilisant la commande Perl perl -pi -e 's /,/,/g '* .txt J'ai été en mesure de supprimer l'espace, mais cela réduit la longueur du segment à 49. Existe-t-il un moyen que je peux supprimer l'espace et également maintenir la longueur du segment et le faire pour tous les enregistrements dans le fichier?

+0

Comment pouvez-vous supprimer un caractère et attendre que la chaîne résultante ait la même longueur? –

+0

Eh bien, l'idée est d'obtenir l'espace supplémentaire à la fin du pays. – Jai

Répondre

0

Pourquoi utiliser Perl quand vous pouvez utiliser sed? Essayez:

sed 's/,\(\s*\)\([^,]*\)/,\2\1/g' 

qui se déplace tout espace entre une virgule et une charge de non-virgules (texte) à la place après le texte.

a, b, c 

devient

a,b ,c 

(avec un espace après le c)

0

Sons comme nous devons faire compter - c'est la voie de la force brute:

s/^(.{24})([^,]+)(+)(.{,49})(.{25})$/$1$2$4$3$5/; 

Cela correspond aux positions de caractères 1-24 en $ 1; l'État se sépare de la première virgule à 2 $, d'une chaîne d'un ou de plusieurs blancs à 3 $, du pays à 4 $ et du personnage de 76 à 100 $ à 5 $.

Le remplacement déplace les espaces après le pays, préservant ainsi la longueur demandée. Ce que vous obtenez si vos enregistrements ne sont pas 100 caractères est ... eh bien, probablement pas ce que vous vouliez. Vous pouvez modifier beaucoup de choses, mais (même s'il s'agit d'un code non testé), il y a de fortes chances que ce soit adéquat ou que vous ayez l'idée dont vous avez besoin.

Questions connexes