Tengo un archivo que contenga las siguientes líneas:

  <parameter name="PortMappingEnabled" access="readWrite" type="xsd:boolean"></parameter>
  <parameter name="PortMappingLeaseDuration" access="readWrite" activeNotify="canDeny" type="xsd:unsignedInt"></parameter>
  <parameter name="RemoteHost" access="readWrite"></parameter>
  <parameter name="ExternalPort" access="readWrite" type="xsd:unsignedInt"></parameter>
  <parameter name="ExternalPortEndRange" access="readWrite" type="xsd:unsignedInt"></parameter>
  <parameter name="InternalPort" access="readWrite" type="xsd:unsignedInt"></parameter>
  <parameter name="PortMappingProtocol" access="readWrite"></parameter>
  <parameter name="InternalClient" access="readWrite"></parameter>
  <parameter name="PortMappingDescription" access="readWrite"></parameter>

Quiero ejecutar el comando en este archivo para extraer sólo los nombres de los parámetros como se muestra en la siguiente salida:

$sedcommand file.txt
PortMappingEnabled
PortMappingLeaseDuration
RemoteHost
ExternalPort
ExternalPortEndRange
InternalPort
PortMappingProtocol
InternalClient
PortMappingDescription

Lo que podría ser este comando?

  • Tenga en cuenta que usted va a estar triste cuando XML que viene a usted en varias líneas, o si el orden de los argumentos de los cambios. Si eso es en absoluto una posibilidad, usted querrá considerar el uso de una adecuada analizador XML.
  • Hm, haga doble estándar con preguntas que pueden ser contestadas en 10 segundos versus aquellas que requieren más tiempo? Donde está el post preguntando lo has probado? Oh, espera…
InformationsquelleAutor MOHAMED | 2013-05-21

5 Comentarios

  1. 33

    Desea awk.

    Esto sería rápido y sucio hack:

    awk -F "\"" '{print $2}' /tmp/file.txt

    PortMappingEnabled
    PortMappingLeaseDuration
    RemoteHost
    ExternalPort
    ExternalPortEndRange
    InternalPort
    PortMappingProtocol
    InternalClient
    PortMappingDescription
    • cut va a hacer el trabajo más rápido 🙂
  2. 81

    grep nació para extraer cosas:

    grep -Po 'name="\K[^"]*'

    prueba con tus datos:

    kent$  echo '<parameter name="PortMappingEnabled" access="readWrite" type="xsd:boolean"></parameter>
      <parameter name="PortMappingLeaseDuration" access="readWrite" activeNotify="canDeny" type="xsd:unsignedInt"></parameter>
      <parameter name="RemoteHost" access="readWrite"></parameter>
      <parameter name="ExternalPort" access="readWrite" type="xsd:unsignedInt"></parameter>
      <parameter name="ExternalPortEndRange" access="readWrite" type="xsd:unsignedInt"></parameter>
      <parameter name="InternalPort" access="readWrite" type="xsd:unsignedInt"></parameter>
      <parameter name="PortMappingProtocol" access="readWrite"></parameter>
      <parameter name="InternalClient" access="readWrite"></parameter>
      <parameter name="PortMappingDescription" access="readWrite"></parameter>
    '|grep -Po 'name="\K[^"]*'
    PortMappingEnabled
    PortMappingLeaseDuration
    RemoteHost
    ExternalPort
    ExternalPortEndRange
    InternalPort
    PortMappingProtocol
    InternalClient
    PortMappingDescription
    • Sólo para tu INFORMACIÓN, desde el grep manual sobre -P: «Esto es muy experimental y grep -P puede advertir de características no implementadas.»
    • No todos los *nix distribuciones de apoyo ‘grep -o’. Un ejemplo que conozco es AIX
    • Creo que el grep enviado por ubuntu linux debe apoyar a la derecha? aunque no soy usuario de ubuntu. La pregunta fue etiquetado con Linux & ubuntu, no es Unix y Aix. Pero que comentario es correcto.
    • A la derecha, se me olvidó comprobar cuál era la pregunta de la orientación. Ubuntu grep en efecto, el apoyo -o.
    • Yo tuve que buscar \K: Se mantiene lo que queda de ella fuera del partido (así que usted no consigue name="PortMappingLeaseDuration". leer Más
    • Para aquellos que no quieran utilizar el -P bandera; no hay otro extendido regex que es apoyado por el defecto grep va a hacer lo que el \K hace, pero usted podría simplemente canalizar a través de la sed: grep -o 'name="[^"]* | sed 's/name="//g'

  3. 51

    sed 's/[^"]*"\([^"]*\).*/\1/'

    hace el trabajo.

    • Que no es ni simple ni elegante. Sólo críptico.
    • para el ojo inexperto, tal vez. Pero pasar tiempo con Expresiones regulares y como el jazz o Picasso, usted podrá apreciar la belleza simple.
    • Eso es lo críptico significa: completamente ilegible para el ojo inexperto.
    • Así cualquier awk truco parece críptico para mí, incluso con ojos entrenados. Me gusta este.
    • Gracias por responder a la pregunta en lugar de proponer una herramienta diferente!
    • ITT: una generación que crecen sin el aprendizaje poderosos fundamentos como expresiones regulares! suspiro Sentado, awk, grep, perl, sed, lex, yacc, javascript, todos utilizan distintas variaciones (gracias posix!) pero sigue siendo una muy potente concepto de programación. Estoy horrorizada por la complejidad de algunas de las respuestas.
    • Mientras se hace el trabajo, sería beneficioso si usted realmente explicar lo que está pasando.
    • Yo siempre te olvides necesitamos de escape ( )
    • Críptico, pero increíblemente potente. Vale la pena el tiempo de aprendizaje, expresiones regulares, créanme.

  4. 16

    Usted no debe analizar XML utilizando herramientas como sed, o awk. Es propenso a errores.

    Si los cambios de la entrada, y antes del nombre del parámetro, se obtendrá nueva línea de caracteres en lugar de espacio se producirá algún día producir resultados inesperados.

    Si usted está realmente seguro de que sus aportaciones serán siempre formateado de esta manera, usted puede utilizar cut.
    Es más rápido que el sed y awk:

    cut -d'"' -f2 < input.txt

    Será mejor que primero analizar y extraer sólo el parámetro de nombre de atributo:

    xpath -q -e //@name input.txt | cut -d'"' -f2

    Para aprender más acerca de xpath, consulte este tutorial: http://www.w3schools.com/xpath/

  5. 5

    Explicar cómo se puede utilizar cut:

    cat yourxmlfile | cut -d'"' -f2

    Va a «cortar» todas las líneas en el archivo basado en « delimiter, y tendrá la 2nd fde campo , que es lo que quería.

Dejar respuesta

Please enter your comment!
Please enter your name here