2016-06-29 3 views
0

У меня есть файл с длинной строкой одной строки между тегами xml, я бы хотел заменить содержимое между тегами sed.Замена многострочной строки между двумя шаблонами с помощью sed

1300_character_long_string_here

Вопросы, я имею что СЭД не заменяет, несмотря на это, я знаю, что мое регулярное выражение выбора правильно. Тем не менее, даже если я могу правильно выбрать и заменить, я не знаю, как вытащить строку замены (которая примерно такая же длинная) из файла и поместить ее.

Вот один из моих более успешных текущих попыток команды:

sed 's/\<Tag\>(.*)\<\/Tag\>/REPLACE/g' test.txt> out.txt 

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

В начале я должен был упомянуть, что это система AIX, а не система GNU.

+1

Вы пробовали '' s # \ (. *) \ <\/Tag\> # REPLACE # g''? – Beta

+0

поиск 'replace multiline string [sed]' возвращает 14 Q/As. Вы посмотрели эти ответы? Вы почти наверняка найдете хороший совет. Удачи. – shellter

+0

регулярные выражения не подходят для изменения xml-документов – hek2mgl

ответ

0

я предлагаю что-то вроде этого:

File1 содержит текст замены, например,

some other string 

File2 содержит меченый строку:

... 
<tag>some string</tag> 
... 

Теперь, вы можете сказать:

sed '1{h;d}; /<tag>/{x;s/^/<tag>/;s/$/<\/tag>/}' File1 File2 

Как это работает: Во-первых, прочитать файл замены, поместите ее одну строку в пространстве удержания и удалить его из выходного потока. Затем, если строка соответствует <tag>, извлеките заменяющий текст из удержания и добавьте теги.

1

Вы можете вставить текст подстановки из файла с помощью команды r:

не избежать < и > в тегах, как он используется для word boundaries. Это может объяснить, почему ваш шаблон не соответствует.

+0

Справа. @KeigaTide. У вас есть, чтобы понять, какой эффект у каждого игрока. Когда вы избегаете метасимвола (например, '*'), он становится литералом, но когда вы избегаете ** некоторых ** буквальных символов в некоторых семплах, они становятся метасимволами (например, '+' или, в этом случае '<' and '>' становятся границами слов в GNU sed). Если вы не уверены, используйте '[]' для инкапсуляции символа (например, '[<]'), чтобы убедиться, что вы превращаете метасимвол в литерал, если это необходимо, но не случайно превращаете литерал в метасимвол). –

+0

@ Kenavoz Как написано, моя версия sed не может разобрать ваше решение, я буду ткнуть на него. Границы слов - это то, о чем я не знал, спасибо. При этом удаление escape-символов вызывало регулярное выражение для выбора всей строки. – KeigaTide

+0

@KeigaTide. '' '' И '' 'в вашем шаблоне должны использоваться для обратной ссылки (вы должны избегать этого' \ ('и' \) 'в основном режиме regex). Он будет не просто соответствовать содержимому '', а всей строкой. – SLePort

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