2017-10-17 5 views
0

Je dispose d'un fichier .txt délimité par des barres de 17 Go et devez remplacer toutes les chaînes de plus de 10 caractères, entre les tubes 32 et 33, par leurs 10 premiers caractères afin de remplir une colonne de base de données sans ouvrir le fichier dans sublime-text; il faudrait donc le faire via Java ou AIX-BASH. Sur regex101.com je tentais de mettre en œuvre les idées présentées dans le post suivant:Remplacer la chaîne entre les délimiteurs suivants avec la sous-chaîne

RegEx: Match nth occurence

mais il ne limite pas le motif correspondant seulement à mon remplacement cordes.

entrée de l'échantillon:

|12210|IA||15||i956-743||||||l.4073||||a5015b3ed||l.464939|IC|||06 06:18:17||wireered||ENTITY|wirvered|2||||NoPodfoundorpoddoesnothaveedgetob-rd=l.415.63Z|REY||||RY|REY||

sortie prévue:

changement ...|NoPodfundddorpoddoesnot...|...-...|NoPodfundd|...

chaîne de sortie complète après le remplacement/troncature:

|12210|IA||15||i956-743||||||l.4073||||a5015b3ed||l.464939|IC|||06 06:18:17||wireered||ENTITY|wirvered|2||||NoPodfundd|REY||||RY|REY||

Tentative de match regex:

^(?:[^|]*\|){32}[^|]+\| qui correspond tout du début à la 33 e |, donc |12210.......l.415.63Z|, mais je veux qu'il corresponde à la chaîne seulement entre les tuyaux 32 et 33, en particulier NoPodfoundorpoddoesnothaveedgetob-rd=l.415.63Z, à des fins de remplacement.

mise à jour 1; 10/18/17:

(^(?:[^|]*\|){32}[^|]{0,10})([^|]*)(\|.*$) la substitution de capture de groupe avec \1\3 fournit le résultat souhaité. Mais ce match doit avoir un défaut car il semble capturer un groupe non-capture (?:[^|]*\|).

mise à jour 2; 19/10/17:

Essayé les commandes suivantes dans la ligne de commande PATE, mais il ne modifie pas le fichier:

cat subStrTest.txt 
awk 'BEGIN{FS=OFS="|"}{$33=substr($33,1,10)} 1' subStrTest.txt 

https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html suggère que

string = substr(string,startIndex,numOfCharacters)

est une syntaxe valide, au moins pour gawk, mais je ne sais pas si la cession

$33=substr($33,1,10)

est valable pour les chaînes référencées avec $, comme dans $33 au sein awk

+0

Si vous exécutez sur unix/linux, pourquoi ne pas utiliser 'sed'? –

+1

Essayez d'utiliser awk. C'est génial pour de tels cas. – Malt

+0

Il n'y a pas de faille, c'est capturer le groupe de non-capture parce qu'il est imbriqué dans un groupe de capture, donc il sera attrapé. En utilisant d'autres expressions de regex, vous pouvez faire sans le premier groupe de capture puisque le jeton '\ K' peut être utilisé. Essayez '^ (?: [^ |] * \ |) {32} \ K (([^ |] {0,10}) [^ |] *) (? = \ |)' Sur regex101. Malheureusement, Java ne supporte pas ce jeton (pour autant que je sache) – ctwheels

Répondre

0

Vous pouvez faire Grouper et le remplacer par une autre donnée ^(?:[^|]*\|){32}([^|]+)\|