2013-07-17 12 views
0

В моем коде shellscript я увидел, что есть строка, которая обрабатывает номер Telephone, используя команду sed.Работа с командой sed linux

sed "s~<Telephone type[ ]*=[ ]*\"fax\"[ ]*><Number>none[ ]*</Number></Telephone>~~g" input.xml > output.xml 

Я не понимаю, что на самом деле делает регулярное выражение.

<Telephone type[ ]*=[ ]*\"fax\"[ ]*><Number>none[ ]*</Number></Telephone> 

Я делаю revere engineering, чтобы получить эту работу.

My xml structure, как показано ниже.

<ContactMethod> 
    <InternetEmailAddress>[email protected]</InternetEmailAddress> 
    <Telephone type = "work"> 
     <Number>215-639-9000 x3281</Number> 
    </Telephone> 
    <Telephone type = "home"> 
     <Number>484-231-1141</Number> 
    </Telephone> 
    <Telephone type = "fax"> 
     <Number>N/A</Number> 
    </Telephone> 
    <Telephone type = "work"> 
     <Number>215-639-9000 x3281</Number> 
    </Telephone> 
    <Telephone type = "home"> 
     <Number>484-231-1141</Number> 
    </Telephone> 
    <Telephone type = "fax"> 
     <Number>none</Number> 
    </Telephone> 
    <Telephone type1 = "fax12234"> 
     <Number>484-231-1141sadsadasdasdaasd</Number> 
    </Telephone> 
</ContactMethod> 
+0

'sed 's ~ text ~~ g" file "удалит любой' text', появляющийся в 'файле'. – fedorqui

ответ

1

Это регулярное выражение распознает <Telephone type = "fax"> записи, где число дается как none, и удаляет их.

Разбивка:

s СЕПГ команда для "замещения".

~10 разделительный шаблон. Для этого вы можете выбрать любого персонажа. sed recoginizes, потому что это происходит сразу после s.

<Telephone type Это соответствует буквальному тексту «< Тип телефона».

[ ]* соответствует нулю или более пробелам.

= соответствует литералу "="

[ ]* соответствует нулю или более пробелов.

\"fax\" соответствует буквальному тексту. Кавычки экранируются, потому что весь шаблон появляется внутри кавычек, но оболочка удаляет символы кавычек (\), прежде чем sed увидит их.

[ ]* соответствует нулю или более пробелам.

><Number>none соответствует буквальному тексту.

[ ]* соответствует нулю или более пробелам.

</Number></Telephone> соответствует буквальному тексту.

~~ разделители шаблонов заканчивают шаблон поиска и окружают пустой шаблон замены.

g - это флаг, который означает, что подстановка будет выполняться несколько раз в каждой строке.

Единственное, что меня смущает, это то, что этот шаблон не будет соответствовать тому, что имеет в нем разрывы строк, поэтому я полагаю, что ваш input.xml на самом деле не отформатирован, как в вашем примере данных?

+0

Значит ли 'sed' распознавать' \ s' за * пробел *? Если так, возможно, лучше рекомендовать это над '[]'? – trojanfoe

+0

@trojanfoe: Никто ничего не рекомендует. Тем не менее, я не уверен, насколько портативен '\ s', но тогда я сомневаюсь, что OP заботится. – ams

+0

Вы можете сделать '[[: space:]]' с помощью sed, но он все еще обрабатывает ** строки **, поэтому вы не найдете никаких новых строк. Есть идиомы («idia»?), Где вы можете накапливать строки в пространстве удержания, но так как sed-команды - все один символ, я нахожу, что довольно быстро становится нечитаемым. \ –

Смежные вопросы