2010-09-23 3 views
0

У меня есть шаблон, с вар LINK и файл данных, links.txt, с одной URL в каждой строкеБаш шаблонный

как в Баш я могу заменить LINK с содержанием links.txt?

если я сделать

#!/bin/bash 
LINKS=$(cat links.txt) 
sed "s/LINKS/$LINK/g" template.xml 

две проблемы:

  1. $ LINKS имеет содержание links.txt без перевода строки

  2. СЭД: 1: «S/LINKS/HTTP : // test ... ": неправильный флаг в команде подстановки: '/'

СЕПГ не побег, // в файле links.txt

благодаря

+0

Можете ли вы опубликовать пример того, как выглядят ваши файлы links.txt и template.xml? – bta

ответ

0

Попробуйте запустить sed дважды. В первом запуске замените / на \/. Второй прогон будет таким же, как и у вас в настоящее время.

+1

Это не нужно. Вам не нужно использовать символ/в подстановках. Вы можете использовать любой символ, который хотите, поэтому выберите тот, который не противоречит URL. например s | | б | или s $ a $ b $ и т. д. (Примечание: я не знаю, являются ли | или $ неверными URL-символы. Я просто использую их в качестве примеров символов, отличных от /) – camh

+0

@ camh- Хорошая точка. Символ '$' является допустимым символом URL, поэтому я бы пошел с '|' или '^'. – bta

0

Символ, следующий за 's' в команде sed, заканчивает разделитель, поэтому вы захотите использовать символ, которого нет в значении $LINK. Например, вы могли бы попробовать запятую:

, что я также добавил \n добавить дополнительную строку
sed "s,LINKS,${LINK}\n,g" template.xml 

Примечание.

Другой вариант - скрыть косые черты в $ LINK, возможно, используя sed. Если у вас нет гарантий относительно символов в $ LINK, это может быть безопаснее.

2

Используйте вместо этого более удобный язык. Я бы написал решение для bash + awk ... но это просто слишком много усилий. (См. http://www.gnu.org/manual/gawk/gawk.html#Getline_002fVariable_002fFile, если вы действительно этого хотите)

Просто используйте любой язык, на котором вам не нужно смешивать текст управления и контента. Например, в Python:

#!/usr/bin/env python 
links = open('links.txt').read() 
template = open('template.xml').read() 
print template.replace('LINKS', links) 

Смотрите, если вы пытаетесь заставить решение с патч в каком-либо другом разделителе - вы получите в те же самые проблемы, если вы не найдете что-то запрещенное в URL-адресе (но вы проверочным что?) Если вы этого не сделаете, у вас уже есть другая проблема: ссылки могут содержать < и > и разбивать ваш xml.

1

Вы можете сделать это с помощью ed:

ed template.xml <<EOF 
/LINKS/d 
.r links.txt 
w output.txt 
EOF 
  • Первая команда будет перейти к строке , содержащие ссылки, и удалить его.
  • Вторая строка будет вставлять содержимое link.txtна текущую линию .
  • Третья команда напишет файл на output.txt (если вы опустите вывод.txt редактирование будет сохранено до template.xml).
Смежные вопросы