GNU/Linux >> Tutoriels Linux >  >> Linux

Comment utiliser sed pour extraire la sous-chaîne

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

fait le travail.

explication de la partie à l'intérieur de ' '

  • s - indique à sed de remplacer
  • / - début de la chaîne regex à rechercher
  • [^"]* - tout caractère qui n'est pas ", n'importe quel nombre de fois. (correspondant à nom du paramètre= )
  • " - juste un " .
  • ([^"]*) - tout ce qui se trouve à l'intérieur de () sera enregistré pour référence à utiliser ultérieurement. Les \ sont là donc les parenthèses ne sont pas considérées comme des caractères à rechercher. [^"]* signifie la même chose que ci-dessus. (correspondant à RemoteHost par exemple)
  • .* - n'importe quel caractère, n'importe quel nombre de fois. (correspondant à " access="readWrite"> /paramètre )
  • / - fin de l'expression régulière de recherche et début de la chaîne de substitution.
  • \1 - référence à cette chaîne que nous avons trouvée entre parenthèses ci-dessus.
  • / fin de la chaîne de substitution.

en gros s/chercher ceci/remplacer par ceci/ mais nous lui disons de remplacer toute la ligne par juste un morceau que nous avons trouvé plus tôt.


grep est né pour extraire des choses :

grep -Po 'name="\K[^"]*'

tester avec vos données :

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

Vous voulez awk .

Ce serait un hack rapide et sale :

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

PortMappingEnabled
PortMappingLeaseDuration
RemoteHost
ExternalPort
ExternalPortEndRange
InternalPort
PortMappingProtocol
InternalClient
PortMappingDescription

Linux
  1. Comment utiliser la commande 'tar' pour extraire les packages de fichiers .xz sous Linux ?

  2. Comment utiliser Sed pour remplacer une chaîne multiligne ?

  3. Extraire la sous-chaîne selon Regexp avec Sed ou Grep ?

  4. Comment utiliser sed pour supprimer uniquement les doubles lignes vides ?

  5. Comment utiliser sed pour supprimer les n dernières lignes d'un fichier

Comment utiliser sed pour rechercher et remplacer une chaîne dans des fichiers

Comment utiliser Instagram dans le terminal

Comment utiliser la commande PS

Comment utiliser la commande TOP

COMMENT UTILISER L'EDITEUR SED

Comment utiliser Sed pour rechercher et remplacer une chaîne dans un fichier