Mi archivo de prueba tiene texto como:
> cat test.txt new dummy("test1", random1).foo("bar1"); new dummy(" test2", random2); new dummy("test3", random3).foo("bar3"); new dummy = dummy( "test4", random4).foo("bar4");Estoy tratando de hacer coincidir todas las líneas individuales que terminan con punto y coma (;) y tienen el texto "dummy(". Luego necesito extraer la cadena presente en las comillas dobles dentro de dummy. Se me ocurrió el siguiente comando, pero solo coincide la primera y tercera afirmación.
> perl -ne 'print if /dummy/ .. /;/' test.txt | grep -oP 'dummy\((.|\n)*,' dummy("test1", dummy("test3",Con la bandera -o, esperaba extraer una cadena entre las comillas dobles dentro del maniquí. Pero eso tampoco está funcionando. ¿Puede por favor darme una idea sobre cómo proceder?
La salida esperada es:
test1 test2 test3 test4Algunas de las respuestas a continuación funcionan para estructuras de archivos básicas. Si las líneas contienen más de 1 carácter de nueva línea, el código se rompe. Por ejemplo, archivos de texto de entrada con más caracteres de línea nueva:
new dummy("test1", random1).foo("bar1"); new dummy(" test2", random2); new dummy("test3", random3).foo("bar3"); new dummy = dummy( "test4", random4).foo("bar4"); new dummy("test5", random5).foo("bar5"); new dummy("test6", random6).foo( "bar6"); new dummy("test7", random7).foo(" bar7");Me referí a los siguientes enlaces SO:
@TLP estuvo bastante cerca:
perl -0777 -nE 'say for map {s/^\s+|\s+$//gr} /\bdummy\(\s*"(.+?)"/gs' test.txt test1 test2Utilizando
-0777 para sorber el archivo como una sola cadena/\bdummy\(\s*"(.+?)"/gs encuentra todo el contenido de la cadena entre comillas después de "dummy(" (con espacios en blanco opcionales antes de la comilla de apertura)s permite . para hacer coincidir las nuevas líneas.map {s/^\s+|\s+$//gr} recorta los espacios en blanco iniciales/posteriores de cada cadena.Este perl debería funcionar:
perl -0777 -pe 's/(?m)^[^(]* dummy\(\s*"\s*([^"]+).*/$1/g' file test1 test2 test3 test4 Seguir gnu-grep + tr también debería funcionar:
grep -zoP '[^(]* dummy\(\s*"\s*\K[^"]+"' file | tr '"' '\n' test1 test2 test3 test4Con las muestras mostradas, intente seguir el código awk , escrito y probado en GNU awk .
awk -v RS='(^|\n)new[^;]*;' ' RT{ rt=RT gsub(/\n+|[[:space:]]+/,"",rt) match(rt,/"[^"]*"/) print substr(rt,RSTART+1,RLENGTH-2) } ' Input_file