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