Подтвердить что ты не робот

Как использовать sed для извлечения подстроки

У меня есть файл, содержащий следующие строки:

  <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>

Я хочу выполнить команду в этом файле, чтобы извлекать только имена параметров, как показано на следующем выходе:

$sedcommand file.txt
PortMappingEnabled
PortMappingLeaseDuration
RemoteHost
ExternalPort
ExternalPortEndRange
InternalPort
PortMappingProtocol
InternalClient
PortMappingDescription

Какая может быть эта команда?

4b9b3361

Ответ 1

Вы хотите awk.

Это будет быстрый и грязный взлом:

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

PortMappingEnabled
PortMappingLeaseDuration
RemoteHost
ExternalPort
ExternalPortEndRange
InternalPort
PortMappingProtocol
InternalClient
PortMappingDescription

Ответ 2

grep родился, чтобы извлечь вещи:

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

проверьте свои данные:

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

Ответ 3

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

выполняет задание.

Ответ 4

Вы не должны анализировать XML с помощью таких инструментов, как sed или awk. Он подвержен ошибкам.

Если ввод изменяется, и перед параметром имени вы получите символ новой строки вместо пробела, он однажды не даст неожиданных результатов.

Если вы действительно уверены, что ваш вход будет всегда сформирован таким образом, вы можете использовать cut. Это быстрее, чем sed и awk:

cut -d'"' -f2 < input.txt

Лучше сначала разобрать его и извлечь только атрибут имени параметра:

xpath -q -e //@name input.txt | cut -d'"' -f2

Чтобы узнать больше о xpath, см. этот учебник: http://www.w3schools.com/xpath/