2015-11-12 2 views
1

Мой вопрос похож на этот other posted question: , но мне нужно только заменить код между двумя html комментариями (...) с кодом из другого файла.Как заменить текст в сценарии bash между конкретными символами с содержимым из другого файла?

Например, в aSample.htm, я хочу, чтобы заменить код между "test1" комментарии:

<!-- test1 Begin --> 
    <link rel="stylesheet" type="text/css" href= 
     "http://www.aServer.com/template/style.css"> 
<!-- test1 End --> 

с кодом из другого файла (например, template.txt):

<!-- Changes Begin --> 
    <link rel="stylesheet" type="text/css" href= 
    "/srv/anotherServer.com/htdocs/api/test/cfHtmlHeadTest.css"> 
<!-- Changes End --> 

Мой скрипт до сих пор запустит все html-файлы из заданного IP-адреса ($ ip) и создаст для них новый каталог. Вот что я пытался использовать для замены на основе другого сайта, на который я искал:

#!/bin/bash 
TEST_FILE=$(cat./template.txt) 
TARGETFILE='app/HtmlPages/"$ip-$currentTime"/"$ip"/index.php/art/*.htm' 
STARTTAG="test1 Begin" 
ENDTAG="test1 End" 

# stuff 

# Replaces all htm files' content between $START-/ENDTAG by inserting line from template.txt 
echo "css replacement test..." 
sed -e "s&\(<\!\-\-\$STARTTAG\-\->\).*\(<\!\-\-\$ENDTAG\-\->\)&\1$TEST_FILE\2&" 

Прежде чем добавлять это изменение, код работал как ожидалось. Однако, когда я внес изменения, система зависает или занимает много времени, и я не ожидал такого небольшого изменения. Я пробовал другие команды sed (например, варианты this site), но у меня есть «неизвестный вариант» s ... »

Я что-то оставил или кто-нибудь знает, что делает система?

+1

'sed' является линия на основе. Он не может (по умолчанию) работать с шаблонами, которые охватывают строки. –

+1

Это будет кошмар в sed, я бы предложил использовать awk или perl вместо – 123

+0

Oh! Хорошо, спасибо. Я не использовал «awk» много, но вот что я пытаюсь (и не удается): 'awk '{sub (/ . * /, "" env [$ TEST_FILE] ""); print} '' Система все еще привязана, когда я ее запускал, но это правильный трек, по крайней мере? – arl

ответ

0

Используйте команду sed r, чтобы прочитать содержимое файла в соответствующее время.

$ cat aSample.htm 
foo 
<!-- test1 Begin --> 
    <link rel="stylesheet" type="text/css" href= 
     "http://www.aServer.com/template/style.css"> 
<!-- test1 End --> 
bar 

$ cat template.txt 
<!-- Changes Begin --> 
    <link rel="stylesheet" type="text/css" href= 
    "/srv/anotherServer.com/htdocs/api/test/cfHtmlHeadTest.css"> 
<!-- Changes End --> 

$ sed ' 
    /<!-- test1 End -->/ r template.txt 
    /<!-- test1 Begin -->/,/<!-- test1 End -->/ d 
' aSample.htm 
foo 
<!-- Changes Begin --> 
    <link rel="stylesheet" type="text/css" href= 
    "/srv/anotherServer.com/htdocs/api/test/cfHtmlHeadTest.css"> 
<!-- Changes End --> 
bar 
+0

Большое вам спасибо! (Я буду тестировать еще и исследовать эту команду, чтобы лучше понять, ваше решение намного чище, чем то, что я пытался.) – arl

+0

[Руководство пользователя GNU sed] (https://www.gnu.org/software/ sed/manual/sed.html) стоит закладок. –

+0

Эй, это сработало красиво! Я не мог использовать мои переменные (но, поскольку они немного испортились на моем конце), но когда я запустил его, как вы указали, я увидел изменения. Еще раз спасибо! – arl

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