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