GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So verwenden Sie sed zum Extrahieren von Teilzeichenfolgen

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

Linux
  1. So verwenden Sie BusyBox unter Linux

  2. So verwenden Sie den Linux-Befehl sed

  3. Wie ich Cron unter Linux verwende

  4. Substring nach Regexp mit Sed oder Grep extrahieren?

  5. Wie verwende ich sed, um nur doppelte Leerzeilen zu entfernen?

So verwenden Sie sed zum Suchen und Ersetzen von Zeichenfolgen in Dateien

So verwenden Sie Instagram im Terminal

So verwenden Sie den PS-Befehl

So verwenden Sie den TOP-Befehl

BENUTZUNG DES SED-EDITORS

So verwenden Sie Sed zum Suchen und Ersetzen einer Zeichenfolge in einer Datei