Un ejemplo, test.txt:
This is bad, real bad! <?xml version="1.0" encoding="UTF-8" ?> <wsdl:definitions targetNamespace="http://tips.cf" xmlns:impl="http://tips.cf" xmlns:intf="http://tips.cf" xmlns:apachesoap="http://xml.apache.org/xml-soap" Tengo una expresión regular: ^<\?xml.*\?> .
grep coincide como línea por línea. Entonces esta expresión regular puede tener una coincidencia (la segunda línea).
Pero quiero que grep trate las líneas como una línea grande, y no podría tener una coincidencia, porque no comienza con <?xml .
Lo intenté:
grep -P -z -- '^<\?xml.*\?>' test.txt use -z pero aún coincide con la segunda línea.
¿Hay alguna manera de usar grep para que no coincida, o hay otra herramienta de línea de comandos de expresiones regulares?
Si usa \A en lugar de ancla ^ , fallará la coincidencia:
# finds no match grep -Pz -- '\A<\?xml.*\?>' file Este grep en una cadena multilínea ^ coincide al comienzo de cada línea, pero \A coincide con el comienzo real de la entrada.
grep que contiene nueva línea ( bash : $'\n' )Prueba esto:
grep -Pz '\AThis.*\n<\?xml.*\?>' test.txt, este
grep -Pz '<\?xml.*\?>' test.txt, este
grep -Pz '^<\?xml.*\?>' test.txty esto
grep -Pz '\A<\?xml.*\?>' test.txto esto
grep -z $'^This.*\n<\\?xml.*\\?>' test.txtPuede unir las líneas a una línea grande mediante xargs antes de aplicar la expresión regular:
# no match returns cat test.txt | xargs | grep '^<?xml.*?>'