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.
3 Réponses :
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}"
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.
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.
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 .
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
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)
Vous devez utiliser des guillemets doubles pour déréférencer les variables:
sed -i "/ $ HKline / d" Need2CleanSED.txt
.