-1
votes

Comment puis-je ajouter des espaces à la fin des lignes spécifiques à l'aide de regex

J'ai un fichier texte qui a des lignes de différentes longueurs. Je dois faire ces uniformes afin que les développeurs de PLSQL fonctionnent la fonction d'importation de texte les lit correctement. Les lignes de 89 caractères doivent être remplies de 4 espaces à la fin. Pour une raison quelconque, l'argument -i à SED n'est accepté ni.

Le fichier peut être trouvé ici

J'ai essayé un certain nombre de commandes de regex différentes découvertes de diverses sources via Google, mais aucune d'entre elles ne fonctionne, que la «fonction ne puisse pas être analysée» ou qu'elle n'a pas ajouté les espaces nécessaires.

Le code que j'ai écrit qui fonctionnait à l'aide de Notepad ++ était de
Trouver: (^. {89}) ($)
Remplacez: \ 1 \ 2

J'ai essayé un certain nombre de commandes UNIX SED telles que
sed -e "s / (^. {89}) ($) / \ 1 \ 2 /" fichier.txt
Sed -e "S / (^. {89}) ($) / \ 1 \ s \ s \ s \ s \ 2 /" fichier.txt
sed -e "s / (^. {89}) ($) / \ 1 \ \ \ \ \ 2 /" fichier.txt
sed -e "s / \ \ \ \ {89 \ \ \ \) \ ($ \ \) / \ 1 \ \ \ \ 2" fichier.txt
Sed -e 'S / \ \ (^. \ {89 \ \ \ \) \ ($ \ \) / \ 1 [[[[Space:]] \ 2 / g' file.txt
Sed -e 's / \ \ (^. \ {89 \ \ \ \ \ \ {89 \ \ \ \) \ ($ \ \) / \ 1 [[[Space:]]] \ {4 \} \ 2 / g' file.txt
SED -E 'S / (^. {89}) ($) / \ 1 [[[[SPACE:]]] {4} \ 2 / g' file.txt


9 commentaires

Êtes-vous sur Mac OS? Essayez sed -i '' '' S / ^. \ \ {89 \} $ / & / / / / / / / / / / / / / / (avec 4 espaces après & ). Dans POSIX BRE motifs, {m, n} Quanifier doit avoir des accolades échappées. Si -I ne fonctionne toujours pas, utilisez SED 'S / ^. \ \ \ {89 \} $ / & & & & & & & & &' File.txt> Newfile.txt


Mieux mettre un exemple de texte ere.


Que voulez-vous dire que l'option -i "n'est pas acceptée"? N'incluez pas la fin de la ligne $ en tant que groupe de capture avec ($) . C'est inutile et ne fonctionnera pas. Avez-vous essayé sed -e "s / (^. {89}) $ / \ 1 /" fichier.txt ?


@Lurker passant à -i à sed que je reçois "SED: option illégale - je". Je viens d'essayer votre commande et que l'erreur "ne peut pas être analysée".


Désolé, j'étais un peu précipité dans mon suggéré. Essayez ceci: sed -e "s / ([^.] {89}) $ / \ 1 /" file.txt


@Lurker Quelque succès. Cette commande, y compris des échappements pour les () {}, des espaces ajoutés, mais des extrémités de la ligne supprimées. J'ai essayé de les ajouter avec sed -e "s / \ ([^.] \ {89 \} \) \ ($ \ \) / \ 1 \ 2 /" mais pas de joie.


Le comportement de sed sur votre système n'est pas le même que Linux. Cela ne devrait pas supprimer une fin de ligne. Le $ est un jeton représentant la fin de la ligne, mais il ne faut pas avoir à être resserré dans le remplacement. Si ma suggestion a fonctionné mais la ligne enlevée se termine, vous pouvez remettre la ligne de ligne, éventuellement, avec sed -e "s / ([^.] {89}) $ / \ 1 \ n / . Vérifiez également les options SED dans la page SED MANUEL ( MAN SED ) pour la manipulation de la ligne.


Je trouve plus d'articles où les gens ont des problèmes avec SED dans HP-UX. L'utilisation de la nouvelle ligne \ N ajoute simplement 'n' où la fin de la ligne devrait être, ce qui est ridiculement frustrant. Je continuerai à essayer différentes combinaisons de la commande.


Ce comportement de \ n est ce dont je crains. Vous pouvez vérifier les options SED car il peut y avoir une option qui la fait de la voir comme une fin de ligne. Je trouve toujours étrange qu'il gère la ligne de ligne si vous utilisez $ sur la grée source. Je suppose qu'une autre option pourrait être awk .


3 Réponses :


0
votes

Le problème principal ici est que vous utilisez la syntaxe BRE POSIX et UNESCAPÉD ( code> / ) code> sont traités comme des parenthèses littérales et sans échéance { code> / } code> est traité comme des accolades littérales.

Ceci devrait fonctionner: P>

sed 's/^.\{89\}$/&    /' file.txt > newfile.txt
  • ^ code> - correspond au début d'une ligne li>
  • . \ {89 \} code> - correspond à tous les caractères 89 li>
  • $ code> - affirme la position finale. LI> ul>

    Le et code> dans le remplacement fait référence à l'ensemble de la correspondance. P>

    Si vous devez utiliser l'option -i code>, voir SED Modifier le fichier en place . p> p>


9 commentaires

Merci @wiktor mais cela n'abandonne que le même fichier texte sans espaces supplémentaires ajoutés aux lignes.


@Paulwright Quelle est votre version SED ? OS? Look, La commande sed fonctionne .


OS semble être HP-UX 11i version 3 février 2007. La commande -v ne fonctionne pas pour me montrer la version de SED.


@Paulwright Je ne trouve aucun détail à ce sujet. Je me demande si & est pris en charge. Essayez sed 's / ^ \ \ \ \ \ \ {89 \} \) $ / \ 1 /' file.txt> newfile.txt


Même résultat que j'ai peur. Je ne pense pas qu'il y ait une solution facile sur HP-UX.


@Paulwright J'ai vu de tels environnements où {m} ne sont tout simplement pas pris en charge. Pouvez-vous s'il vous plaît essayer echo "1234567890" | SED 's /^............$/ & /' et confirmez si cela fonctionne?


On dirait qu'il a ajouté un espace à la fin de la chaîne. J'ai besoin de taper 89. Il faut le faire travailler alors?


@Paulwright Eh bien, je crains que ce soit le seul moyen de sortir.


Je viens d'essayer cela avec le fichier. Cela fonctionne jusqu'à ce que j'utilise le caractère final de la ligne. Alors il ne semble pas trouver un match?



0
votes

Essayez ceci:

awk '{ <br>
 diff = 89 - length($0); <br>
 for(i=1;i<=diff; i++) <br>
 { <br>
   $0 = $0  "a" <br>
 } <br>
 print $0 <br>
} <br>
' FileName.txt


0 commentaires

0
votes

Outils logiciels Kudge pour HP-UX, basé sur Ses manuels : < Pré> xxx

Comment ça marche:

  1. Utilisez SED pour créer un flux factice du même nombre de lignes que fichier , mais avec quatre espaces de chaque ligne.
  2. Utilisez coller pour ajouter le flux factice à ce qui est dans fichier . (En raison du -d '' ' il ajoute cinq espaces, mais cela ne comporte pas beaucoup.)
  3. Utilisez couper pour couper quelque chose sur 93 octets.

    si hp-ux sed est encore moins comme gnu SED que j'ai supposé, il pourrait être remplacé par un certain équivalent comme: xxx


0 commentaires