patterns.txt:
"BananaOpinion"
"ExitWarning"
"SomeMessage"
"Help"
"Introduction"
"MessageToUser"
Strings.xml
<string name="Introduction">One day there was an apple that went to the market.</string>
<string name="BananaOpinion">Bananas are great!</string>
<string name="MessageToUser">We would like to give you apples, bananas and tomatoes.</string>
Rendimiento esperado:
"ExitWarning"
"SomeMessage"
"Help"
¿Cómo imprimo los términos patterns.txt
que no se encuentran en Strings.xml
? Puedo imprimir los emparejados / incomparables líneas en Strings.xml
, pero ¿cómo puedo imprimir los incomparables patrones ? Estoy usando ggrep (GNU grep) versión 2.21, pero estoy abierto a otras herramientas. Disculpas si este es un duplicado de otra pregunta que no pude encontrar.
Strings1.xml
yStrings2.xml
), también necesitará el-h
indicador en el primer grep.grep
admiten esa opción. Si tiene varios archivos de entrada, no entiendo por qué no podría simplementecat
eliminarlos todos y canalizar el resultadogrep
.El mejor enfoque es probablemente lo que sugirió @don_crissti, así que aquí hay una variación sobre el mismo tema:
Esto es básicamente lo contrario del enfoque de @ don_crissti. Utiliza grep con Expresiones regulares compatibles con Perl (
-P
) y el-o
interruptor para imprimir solo la parte correspondiente de la línea. Luego, la expresión regular lo buscaname=
y lo descarta (\K
), y luego busca uno o más caracteres hasta el primero"
(.+?"
). Esto da como resultado la lista de patrones presentes en elString.txt
archivo que luego se pasa como entrada a un grep inverso (grep -v
) usando la sustitución de proceso (<(command)
).fuente
Yo usaría
cut
, probablemente. Es decir, si, como parece, sabe dónde esperar la cadena citada que está buscando.Si lo hago:
... después de salvar mi propia copia de su ejemplo
patterns.txt
enpat
y ejecutar el comando anterior, la salida es:cut
imprime en stdout solo el segundo campo eliminado de"
comillas-d
dobles-f
para cada línea de entrada-s
delimitadora y presiona todas las demás.Lo que
cut
realmente imprimegrep
es:grep
busca en su operando de archivo nombrado las líneas que-v
no coinciden con las-F
cadenas ixed en su-
patrón de patrón estándar-f
.Si puede confiar en el segundo
"
campo delimitado como el que debe coincidir, entonces definitivamente será una optimización sobre elgrep
-P
modo erl simplemente haciendo coincidir las-F
cadenas ixed y solo pequeñas porciones de ellas porquecut
hace el trabajo pesado, y lo hace rápido .fuente
es fácil de entender pero tiene el tiempo de inactividad de generar múltiples procesos grep, uno para cada línea en patterns.txt.
fuente
otra forma es poner patterns.txt y Strings.xml en una lista y encontrar filas únicas
explicación:
cat patterns.txt Strings.xml
pone todo en una lista.grep -oFf patterns.txt
elimina la basura en cada línea.sort
Autoexplicativo. Ordenar todas las líneas.uniq -u
imprime solo líneas únicas.fuente