sed 's/[^"]*"\([^"]*\).*/\1/'
macht den Job.
Erläuterung des Teils innerhalb von ' '
- s - weist sed an, zu ersetzen
- / - Beginn der Regex-Zeichenfolge, nach der gesucht werden soll
- [^"]* - jedes Zeichen, das nicht " ist, beliebig oft. (passender Parametername= )
- " - nur ein " .
- ([^"]*) - alles innerhalb von () wird als Referenz zur späteren Verwendung gespeichert. Das \ ist vorhanden, sodass die Klammern nicht als zu suchende Zeichen betrachtet werden. [^"]* bedeutet dasselbe wie oben. (passend zu RemoteHost zum Beispiel)
- .* - beliebiges Zeichen, beliebig oft. (passend zu " access="readWrite"> /parameter )
- / - Ende der Such-Regex und Beginn der Ersatzzeichenfolge.
- \1 - Verweis auf diesen String, den wir in den Klammern oben gefunden haben.
- / Ende der Ersatzzeichenfolge.
im Grunde s/nach diesem suchen/durch dieses ersetzen/, aber wir sagen ihm, dass er die ganze Zeile durch nur ein Stück davon ersetzen soll, das wir zuvor gefunden haben.
grep wurde geboren, um Dinge zu extrahieren:
grep -Po 'name="\K[^"]*'
Test mit Ihren Daten:
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
Sie wollen awk
.
Dies wäre ein schneller und schmutziger Hack:
awk -F "\"" '{print $2}' /tmp/file.txt
PortMappingEnabled
PortMappingLeaseDuration
RemoteHost
ExternalPort
ExternalPortEndRange
InternalPort
PortMappingProtocol
InternalClient
PortMappingDescription