2015-11-04 2 views
-1

Я пытаюсь устранить < ..> теги из этого небольшого скрипта (его имя test):Изменение скрипта с sep. Противоречивые поведение

<chan‌​ges><comment>Testing 

Comment 

Footer 
</comment></chan‌​ges> 

Whevener Стараюсь с cat test | sed -e "s/<\/comment>//g; s/<comment>/ /g" > test1,

выход правильно:

<chan‌​ges> Testing 

Comment 

Footer 
</chan‌​ges> 

Но когда я попробую cat test | sed -e "s/<\/changes>//g; s/<changes>/ /g" > test1, сценарий остается неизменным.

У меня есть копия/вставка каждой команды на оболочке и протестирована, прежде чем положить ее сюда, поэтому я считаю, что это не вопрос опечаток.

Кто-нибудь знает, что это за темная магия?

+0

В тексте 'changes' есть некоторые странные символы. Если я его скопирую, я вижу 'chan <200c><200b> ges'. – fedorqui

+0

Похоже на XML. Это XML? Потому что, если это так, вы должны использовать синтаксический анализатор. – Sobrique

ответ

1

Предположим, что вы хотите конвертировать:

<chan‌​ges><comment>Testing 

Comment 

Footer 
</comment></chan‌​ges> 

To:

<chan‌​ges>Testing 

Comment 

Footer 
</chan‌​ges> 

Вы можете использовать (?:<(comment)>)(.*)(?:<\/\1>) и заменить на \2 https://regex101.com/r/rC1rP6/1

Edit: Simpler регулярных выражений и СЕПГ, например:

cat test | sed 's/<\/\?comment>//g 

Заменить comment с chan‌​ges, чтобы соответствовать другим индуктора.

Примечание: Причина вы не смогли, потому что changes пишется с юникода характер:

  • cat test | xxd шоу:

    0000000: 3c63 6861 6ee2 808c e280 8b67 6573 3e3c <chan......ges>< 
    
  • когда echo '<changes>' | xxd шоу:

    0000000: 3c63 6861 6e67 6573 3e0a     <changes>. 
    
+1

Я знаю, что есть много возможностей улучшить регулярное выражение, но я хочу удалить '', '' и '' уже заменить на текущую команду. Инструмент regex отлично работает. Спасибо за это –

+0

См. Мои изменения и объяснения. – Cyrbil

+0

Вы правы, исходный текст написан в Юникоде. +1 для объяснения того, как это видно. –

0

Я считаю, что правильным инструментом для задания является не a regex. Поскольку одно регулярное выражение не очень хорошо подходит для соответствия меток. Я бы вместо того, чтобы предложить использовать анализатор - это Perl фрагмент кода, который будет делать то, что вам требуется:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use XML::Twig; 

print XML::Twig -> parse (\*DATA) -> get_xpath('//*',0) -> text; 

__DATA__ 
<changes><comment>Testing 

Comment 

Footer 
</comment></changes> 

NB - пришлось очистить исходные данные, которые имели какие-то странные символы, когда я скопировал и вставил, который может на самом деле быть корнем вашей проблемы.

Это вы могли бы один лайнер, как:

perl -MXML::Twig -0777 'print XML::Twig->parse(<>)->get_xpath('//*',0)->text;' you_xml_filename 

(Или это будет принимать входной сигнал на трубе).

Для более сложных сценариев, это не будет работать так же хорошо, но это довольно тривиально, чтобы приспособиться к более общим ярлыком зачистки:

Eg:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use XML::Twig; 

print map { $_ -> text } XML::Twig -> parse (\*DATA) -> get_xpath('//#PCDATA'); 

__DATA__ 
<changes><comment>Testing 

Comment 

Footer 
</comment> 
<anothercomment>fish here 
</anothercomment> 
<some_other_tag an_attribute="some_attribute">More text here</some_other_tag> 
</changes> 

(XML::Twig может потребоваться установка . Это должно быть просто, как cpan XML::Twig или использовать диспетчера пакетов.)

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