sed 's/[^"]*"\([^"]*\).*/\1/'
fa il lavoro.
spiegazione della parte all'interno di ' '
- s - dice a sed di sostituire
- / - inizio della stringa regex da cercare
- [^"]* - qualsiasi carattere che non sia ", qualsiasi numero di volte. (corrispondente a nome parametro= )
- " - solo un " .
- ([^"]*) - qualsiasi cosa all'interno di () verrà salvata per riferimento da utilizzare in seguito. Le \ ci sono quindi le parentesi non sono considerate come caratteri da cercare. [^"]* ha lo stesso significato di sopra. (corrisponde a RemoteHost ad esempio)
- .* - qualsiasi carattere, qualsiasi numero di volte. (corrispondente a " access="readWrite"> /parameter )
- / - fine della regex di ricerca e inizio della stringa sostitutiva.
- \1 - riferimento a quella stringa che abbiamo trovato tra parentesi qui sopra.
- / fine della stringa sostitutiva.
fondamentalmente s/cerca questo/sostituisci con questo/ ma gli stiamo dicendo di sostituire l'intera riga con solo una parte di essa che abbiamo trovato in precedenza.
grep è nato per estrarre cose:
grep -Po 'name="\K[^"]*'
prova con i tuoi dati:
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
Vuoi awk
.
Questo sarebbe un hack veloce e sporco:
awk -F "\"" '{print $2}' /tmp/file.txt
PortMappingEnabled
PortMappingLeaseDuration
RemoteHost
ExternalPort
ExternalPortEndRange
InternalPort
PortMappingProtocol
InternalClient
PortMappingDescription