GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo usar sed para extraer subcadena

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

hace el trabajo.

explicación de la parte interior ' '

  • s - le dice a sed que sustituya
  • / - inicio de la cadena de expresiones regulares a buscar
  • [^"]* - cualquier carácter que no sea ", cualquier número de veces. (coincidiendo con nombre del parámetro= )
  • " - solo un " .
  • ([^"]*) - cualquier cosa dentro () se guardará como referencia para su uso posterior. Los \ están allí, por lo que los corchetes no se consideran caracteres para buscar. [^"]* significa lo mismo que arriba. (coincide con RemoteHost por ejemplo)
  • .* - cualquier carácter, cualquier número de veces. (coincidencia " access="readWrite"> /parámetro )
  • / - final de la expresión regular de búsqueda y comienzo de la cadena de sustitución.
  • \1 - referencia a la cadena que encontramos entre paréntesis arriba.
  • / final de la cadena sustituta.

básicamente s/buscar esto/reemplazar con esto/ pero le estamos diciendo que reemplace toda la línea con solo una parte que encontramos antes.


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

Quieres awk .

Este sería un truco rápido y sucio:

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

PortMappingEnabled
PortMappingLeaseDuration
RemoteHost
ExternalPort
ExternalPortEndRange
InternalPort
PortMappingProtocol
InternalClient
PortMappingDescription

Linux
  1. Cómo usar BusyBox en Linux

  2. Cómo usar el comando sed de Linux

  3. Cómo uso cron en Linux

  4. ¿Extraer subcadena según Regexp con Sed o Grep?

  5. Cómo usar sed para eliminar las últimas n líneas de un archivo

Cómo usar sed para buscar y reemplazar cadenas en archivos

Cómo usar Instagram en la terminal

Cómo usar el comando PS

Cómo usar el comando SUPERIOR

CÓMO UTILIZAR EL EDITOR SED

Cómo usar Sed para buscar y reemplazar una cadena en un archivo