2010-06-19 3 views
0

Я попытался это бесчисленные способы, время, чтобы бросить в полотенце и попросить хозяина ...СЭД переменной замены

#!/bin/bash 

# Read in the VERSION.header file, this is a plain text file 
# with returns, which in some of my tests, I am loosing the returns and getting 
# one string wrapped only by the shell width 
VERSION_HEADER=`cat VERSION.header` 

sed 's/_VERSION_HEADER_/"$VERSION_HEADER"/g' DOCUMENTATION 

Строка «_VERSION_HEADER_» существует в настоящее время в строке 1 в файле документации. Файл VERSION.header содержит около 18 строк.

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

Пример:

$ кошка VERSION.header

hi, this is my header file, how are you today 
good, that is nice, great 
have a nice day, k, thx, bye. 

$ кошки ДОКУМЕНТАЦИЯ

_VERSION_HEADER_ 

# This is a documentation file, please read it 
# If you do not read it, you will get stuck to the toilet. 

И результат должен быть:

привет, это мой файл заголовка, как вы сегодня
хорошо, что приятно , отлично
хороший день, k, thx, bye.

# Это файл документации, пожалуйста, прочтите его
# Если вы его не прочитали, вы попадете в туалет.

+0

Каков у вас результат? – hudolejev

+0

Возможный дубликат [Заменить текст переменной (sed)] (http: // stackoverflow.com/questions/16297052/replace-a-text-with-a-variable-sed) – tripleee

ответ

0
sed -i "s/_VERSION_HEADER_/$VERSION_HEADER/g" DOCUMENTATION 

EDIT

К сожалению, наконец, получил вашу проблему. У вас многострочный шаблон. This может помочь. Также рассмотрите вместо этого использование Python:

#!/usr/bin/env python 

f = open('doc.txt', 'r') 
doc = f.read() 
f.close() 

f = open('VERSION.header', 'r') 
versionHeader = f.read() 
f.close() 

doc = doc.replace('_VERSION_HEADER_', versionHeader) 
print doc 

Это может быть менее эффективным.

+0

Спасибо, пытаясь сохранить это в bash, поэтому он переносится в системы, которые не всегда будут иметь python. Ошибка: sed: 1: «ДОКУМЕНТАЦИЯ»: дополнительные символы в конце команды D – user170579

-1

Как о чем-то вроде этого:

#!/bin/bash 

while read oneline; do 
    VERSION_HEADER=${VERSION_HEADER}'\n'${oneline}; 
done < VERSION.header 

sed 's/_VERSION_HEADER_/'"${VERSION_HEADER}"'/g' DOCUMENTATION 
1

Дайте этому попытку:

sed -e '/_VERSION_HEADER_/{r VERSION.header' -e ';d}' DOCUMENTATION 

, который читает в файле, когда он находит строку шаблона, а затем удаляет строку шаблона.

+0

Я получаю сообщение об ошибке: sed: 1: "; d} \ n": дополнительные символы в конце команды d – user170579

+0

@allentown : Он работает для меня, используя GNU sed 4.2.1. Какая у вас версия (и какая ОС и версия)? –

+0

@ user170579: Попробуйте без точки с запятой - некоторые версии 'sed' им не нравятся. –

0

AWK

awk 'FNR==NR{s=s" "$0"\n";next}/_VERSION_HEADER_/{$0=s}1' version.header documentation 
0

Может быть, посмотрите на человека 1-е изд, а также:

# http://wiki.bash-hackers.org/doku.php?id=howto:edit-ed 
[[ $(grep -c _VERSION_HEADER_ DOCUMENTATION) -eq 1 ]] && \ 
cat <<-'EOF' | sed -e 's/^ *//' -e 's/ *$//' | ed -s DOCUMENTATION 
    H 
    /_VERSION_HEADER_/i 
    . 
    .c 
    . 
    .r VERSION.header 
    wq 
EOF 
0

Использование (FreeBSD) SED сделать что-то вроде:

VERSION_HEADER="$(sed -E -e 's/\\/\\\\/g' -e 's/&/\\\&/g' -e 's|/|\\/|g' -e 's/$/\\/g' VERSION.header)" 

# note the space after ${VERSION_HEADER} 
sed -E -i "" "/_VERSION_HEADER_/s/_VERSION_HEADER_/${VERSION_HEADER} /" DOCUMENTATION 
0

Вам нужно бежать ваш текст:

text=$(cat VERSION.header); 
escaped_text=$(echo "$text" | sed 's/[/\\&]/\\&/g;s/$/\\/;$s/\\$//') 
sed "s/_VERSION_HEADER_/$escaped_text/g" DOCUMENTATION 
Смежные вопросы