shell awk sed grep cut

shell - grep valora y reorganiza el archivo



awk sed (6)

Como una alternativa a las soluciones awk y grep .

sed -rn ''s|.*"([^"]*)"/>|/1|p'' xml | pr -2ats/

hola, tengo un nombre de archivo test.txt

(standard input):8: <property name="ProcedureName" value="abc"/> (standard input):7: <property name="PackageName" value="123abc"/> (standard input):8: <property name="ProcedureName" value="bac"/> (standard input):7: <property name="PackageName" value="bac123"/> (standard input):8: <property name="ProcedureName" value="cde"/> (standard input):7: <property name="PackageName" value="cd123"/> (standard input):8: <property name="ProcedureName" value="b4u"/> (standard input):7: <property name="PackageName" value="b4u234"/>

Tengo que grep solo los valores de packagename y procdeurename de este archivo en el siguiente formato: en un archivo o / p

abc/123abc bac/bac123 cde/cd123 b4u/b4u234

intenté cortar y awk pero no pude conseguir eso


Con GNU grep and paste:

grep -oP ''"/K[^"]*(?="/)'' file | paste -d / - -

Salida:

abc/123abc bac/bac123 cde/cd123 b4u/b4u234


Mi primer intento (y el que realmente recomendaría) fue el mismo que el de @ sat, así que lo eliminé y aquí hay un enfoque diferente en caso de que sea útil en otro contexto:

$ awk -F''"'' ''{n2v[$2]=$4} !(NR%2){print n2v["ProcedureName"] "/" n2v["PackageName"] }'' file abc/123abc bac/bac123 cde/cd123 b4u/b4u234

n2v significa name2value , un nombre de matriz que a menudo uso para el tipo de aplicación donde tenemos asignaciones de nombre a valor en el archivo de entrada.


Prueba este awk :

awk -F''"'' ''NR%2{p1=$4;next} {print p1 "/" $4}''

Prueba:

$ awk -F''"'' ''NR%2{p1=$4;next} {print p1 "/" $4}'' file abc/123abc bac/bac123 cde/cd123 b4u/b4u234


awk debería poder hacer esto por usted:

awk -F''"'' ''BEGIN { OFS="/" } $2=="ProcedureName"{procedureName=$4} $2=="PackageName" { print procedureName,$4 }'' yourfilename

Esto usará una comilla doble como separador. Comprueba la cadena "ProcedureName" en la posición 2 y almacena la posición 4 en la variable procedureName . Luego, si encuentra "PackageName" en la posición 2, imprime el procedureName almacenado y el material de la posición 4. Y utiliza la barra invertida como OutputFieldSeperator.

Técnicamente, podrías conectar tu grep a esto, pero awk solo puede hacer la búsqueda en sí, que es lo que escribí aquí.


Esto podría funcionar para usted (GNU sed):

sed ''N;s#.*value="/([^"]*/)".*value="/([^"]*/)".*#/1//2#'' file

Lea dos líneas a la vez y extraiga los valores entre comillas dobles precedidas por el value= literal value= .

Otra versión un poco más corta que utiliza una referencia inversa en la opción LHS y -r para facilitar la lectura de la expresión regular:

sed -r ''N;s#.*(value=")([^"]*)".*/1([^"]*)".*#/2//3#'' file

Otra forma más, usando el espacio de espera y la sustitución:

sed -r ''s/.*"(.*)".*//1/;h;N;s///1/;H;g;s#/n#/#'' file

Extrae el último valor entre comillas dobles en dos líneas sucesivas y reorganiza los resultados a la cadena requerida.