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
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
Si vous exécutez sur unix/linux, pourquoi ne pas utiliser 'sed'? –
Essayez d'utiliser awk. C'est génial pour de tels cas. – Malt
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