2017-05-23 6 views
0

J'essaye d'écrire une instruction diff de Linux pour ignorer toutes les différences de ligne qui ont une chaîne littérale quelque part dedans. (Dans mon cas, je veux ignorer les lignes avec des différences d'URL.)Comment rechercher et exclure des littéraux de regex de chaîne de comparaison de diff?

Actuellement, j'ai essayé

diff -I '^insert.*' file1.txt file2.txt > outputDiff.txt 

La sortie ici a des lignes qui ont commencé avec insert, de sorte que c'est un pas dans la bonne direction, mais j'ai besoin de retirer un littéral de chaîne plus longue (url) avec beaucoup de périodes et de barres obliques.

Pour être exact: je dois chercher des lignes qui ont:

ta.com/nmo/nmdr/templates/nmdr.css\ 

quelque part en eux, et les exclure du résultat de diff.

Comment rechercher une chaîne littérale avec une regex qui fonctionnera dans une instruction diff -I? (Inclure le début de la ligne et la fin de la ligne si cela est nécessaire pour mon instruction diff)

Répondre

0

Vous devez vous échapper . et \ dans l'expression rationnelle.

diff -I 'ta\.com/nmo/nmdr/templates/nmdr\.css\\' file1.txt file2.txt > outputDiff.txxdt 
0

Dans une commande:

diff -I 'ta\.com/nmo/nmdr/templates/nmdr\.css\\' file1.txt file2.txt \ 
    > outputDiff.txt 

Ceci est le caractère . échappe spécial (ce qui signifie généralement « tout caractère »), et la manipulation aussi anti-slash.

Ou bien, vous pouvez le faire (un peu moins efficace) dans une commande chaîne:

diff file1.txt file2.txt | fgrep -v 'ta.com/nmo/nmdr/templates/nmdr.css\\' \ 
    > outputDiff.txt 

fgrep ou grep -F équivalente, signifie « grep rapide » et échappe automatiquement des caractères spéciaux comme .