1
votes

besoin de nettoyer le fichier via SED ou GREP

J'ai ces fichiers

  • NotRequired.txt (dont les lignes doivent être supprimées)
  • Need2CleanSED.txt (gros fichier, besoin de nettoyer)
  • Need2CleanGRP.txt (gros fichier, besoin de nettoyer)

content:

myFile="NotRequired.txt"

while IFS= read -r HKline

do

  sed -i '/$HKline/d' Need2CleanSED.txt

done < "$myFile"


myFile="NotRequired.txt"

while IFS= read -r HKline

do

  grep -vE \"$HKline\" Need2CleanGRP.txt > Need2CleanGRP.txt

done < "$myFile"

Je lis le fichier ci-dessus et je souhaite supprimer des lignes de Need2Clean ???. txt , en essayant via SED et GREP mais sans succès.

more NotRequired.txt
[abc-xyz_pqr-pe2_123]
[lon-abc-tkt_1202]
[wat-7600-1_414]
[indo-pak_isu-5_761]

On dirait que la variable et les caractères [] posent un problème.


1 commentaires

Vous devez utiliser des guillemets doubles pour déréférencer les variables: sed -i "/ $ HKline / d" Need2CleanSED.txt .


3 Réponses :


0
votes

Votre hypothèse est correcte. La construction [...] recherche tous les caractères de cet ensemble, vous devez donc les faire précéder ("échapper") de \ . Le moyen le plus simple est de le faire dans votre fichier d'origine:

HKline=$( echo $HKline | sed -e 's:\[:\\[:' -e 's:\]:\\]:' )

Si vous n'aimez pas cela, vous pouvez probablement placer la commande sed là où vous êtes diriger le fichier vers:

done < replace.txt|sed -e 's:\[:\\[:' -e 's:\]:\\]:'

Enfin, vous pouvez utiliser sed sur chaque variable HKline :

sed -i -e 's:\[:\\[:' -e 's:\]:\\]:' "${myFile}"


2 commentaires

Merci Jack / Bummi ... c'est résolu (j'ai édité mon fichier original NotRequired.txt avec \ [abc-xyz_pqr-pe2_123] (slash ajouté \ dans chaque ligne comme premier caractère) et sed -i -e "/ $ HKline / d "Need2CleanSED.txt


Consultez stackoverflow.com/q/29613304/1745001 pour certains des autres caractères et chaînes auxquels vous devez également faire attention. cette approche et méfiez-vous également des caractères ou espaces globuleux.



3
votes

Ce que vous faites est extrêmement inefficace et sujet aux erreurs. Faites simplement ceci:

grep -vF -f NotRequired.txt Need2CleanGRP.txt > tmp &&
mv tmp Need2CleanGRP.txt

Grâce à grep -F , ce qui précède traite chaque ligne de NotRequired.txt comme une chaîne plutôt qu'une expression rationnelle pour que vous n'ayez pas à le faire vous inquiétez pas d'échapper aux métachars RE comme [ et vous n'avez pas besoin de l'envelopper dans une boucle shell - cette commande supprimera toutes les lignes indésirables en une seule exécution de grep .

Ne faites jamais de command file> file btw car le shell pourrait décider d'exécuter le > fichier d'abord et donc de vider le fichier avant La commande a une chance de la lire! Utilisez toujours command file> tmp && mv tmp file à la place.


2 commentaires

Merci pour les conseils, je veux juste être clair, je vois 2 lignes, si ce sont vraiment 2 lignes, quelle est la signification de && en première ligne. Si sa commande en une ligne entière, alors c'est OK (la deuxième ligne s'exécutera après la première). && = opérateur AND


Le && signifie que n'exécute la 2ème commande que si la première réussit . Sans cela, si le grep échouait, alors mv remplacerait votre fichier Need2CleanGRP.txt par un fichier tmp vide .



0
votes

essayez gnu sed:

/\[abc-xyz_pqr-pe2_123\]|\[lon-abc-tkt_1202\]|\[wat-7600-1_414\]|\[indo-pak_isu-5_761\]/d

Deux processus sed sont enchaînés en un par un tube shell
NotRequired.txt est "slurped" par sed -z en même temps et a remplacé ses méta \ n et [ -char avec | et \ [ respectivement dont le 2ème processus l'utilise comme script regex pour le fichier d'entrée, ie. Need2CleanSED.txt. 1ère sortie de processus;

sed -Ez 's/\n/\|/g;s!\[!\\[!g;s!\]!\\]!g; s!(.*).!/\1/d!' NotRequired.txt| sed -Ef - Need2CleanSED.txt

ajouter -u ie. sans tampon, option pour éviter le traitement par lots, sorte d'entrées / sorties directes


3 commentaires

pouvez-vous s'il vous plaît expliquer ci-dessus et répondre à une question spécifique en utilisant le nom de ces fichiers (NotRequired.txt, Need2CleanSED.txt) aidera également à l'avenir pour les autres utilisateurs.


Merci Abdan, juste une clarification, si NotRequired.txt ayant plus de 30000 lignes, modèle similaire, gérera, s'exécutera avec succès? ou besoin d'aide de: commande xargs


GNU sed version 4.2.1 , sed: option invalide - 'z' (I USED => sed -Ezu rest est identique à ce que vous avez mentionné dans la toute première ligne)