2017-07-18 1 views
0

J'ai un fichier texte avec des milliers de transactions bancaires et j'ai besoin de rechercher et remplacer du texte basé sur le texte trouvé sur une autre ligne de la transaction. Chaque transaction est répertorié en tant que telle ...trouver conditionnel et remplacer par sed

2016/01/08 * POS DEBIT LOWES #02793* SPOKANE VALLE WA #7522 
    Expenses:Unknown       $289.78 
    Assets:INB Checking 

Je dois être en mesure de rechercher la première ligne pour « LOWES » et si le texte correspond à cela changera les frais colonne dépenses: Matériaux de construction

donc toute l'opération aimerait comme ça ...

2016/01/08 * POS DEBIT LOWES #02793* SPOKANE VALLE WA #7522 
    Expenses:Building Materials    $289.78 
    Assets:INB Checking 

Je sais que je peux utiliser sed pour ne trouver et remplacer, mais comment puis-je le faire en fonction d'un match de motif sur la première ligne?

+0

il vaudra mieux que vous montriez comment ces transactions sont séparées, par exemple avec des nouvelles lignes entre? 'awk' est mieux adapté, mais je pense que pour votre but, en utilisant la commande' N' ferait ... – Sundeep

+0

Il n'y a pas de lignes entre les transactions, elles continuent juste comme indiqué sans séparation. – freefly0313

+0

hmm ok .. Je pense que l'utilisation de la commande 'n' ou' N' de sed correspondrait ici .. voir http://www.grymoire.com/Unix/Sed.html#uh-51 pour un exemple – Sundeep

Répondre

0

Vous pouvez utiliser une adresse de départ et boucle avec la commande t pour rechercher et remplacer votre modèle jusqu'à la ligne suivante ne commençant pas par le nombre:

sed '/LOWES/{:a;N;/\n[^0-9]/{s/\(Expenses:\).*/\1Building Materials/;P;D;}}' file 

Essayez le drapeau -i éditer le fichier en place :

sed -i '/LOWES/{:a;N;/\n[^0-9]/{s/\(Expenses:\).*/\1Building Materials/;P;D;}}' file 
0

Si vous pouvez supposer que chaque dépense LOWES commence par une ligne correspondant à LOWES et se termine par un frais de correspondance de ligne, il vous suffit de faire ceci:

sed -e '/LOWES/,/Expenses/s/Unknown/Building Materials/'

Cela dit que dans toutes les gammes de lignes de/LOWES/à/Frais/remplacer 'Unknown' avec 'Matériaux de construction'. Si vous utilisez un modèle plus simple comme celui-ci au lieu de la solution plus robuste suggérée par SLePort, il est essentiel de différencier les résultats et de vous assurer que vous n'avez pas altéré quelque chose d'autre.