2010-06-19 8 views
0

J'ai essayé ce d'innombrables façons, le temps de jeter l'éponge et de demander au maître ...remplacement variables sed

#!/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 

La chaîne « _VERSION_HEADER_ » existe actuellement 1 ligne dans le fichier DOCUMENTATION. Le fichier 'VERSION.header' contient environ 18 lignes.

Je ne suis pas attaché à utiliser sed. Tout ce que je cherche à faire est de lire dans un fichier qui sert de modèle, de stocker les fichiers en tant que variables, de les lire dans un second fichier, de les stocker en tant que variables. Regardez dans le second fichier pour un marqueur, remplacez le marqueur par les données du premier fichier.

Exemple:

$ cat VERSION.header

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

$ cat DOCUMENTATION

_VERSION_HEADER_ 

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

Et le résultat devrait être:

Salut, voici mon fichier d'en-tête, comment allez-vous aujourd'hui
bien, c'est gentil , super
passez une bonne journée, k, merci, au revoir.

# Ceci est un fichier de documentation, s'il vous plaît lire
# Si vous ne lisez pas, vous obtiendrez coincé aux toilettes.

+0

Quel est le résultat que vous avez obtenu? – hudolejev

+0

duplication possible de [Remplacer un texte par une variable (sed)] (http: // stackoverflow.com/questions/16297052/replace-a-text-with-a-variable-sed) – tripleee

Répondre

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

EDIT

Désolé, a finalement obtenu votre problème. Vous avez un motif multi-lignes. This peut aider. Pensez également à utiliser Python à la place:

#!/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 

Ceci peut être moins efficace.

+0

Merci, en essayant de garder ceci dans bash pour le moment, donc il est portable pour les systèmes qui n'auront pas toujours python. Erreur: sed: 1: "DOCUMENTATION": caractères supplémentaires à la fin de la commande D – user170579

-1

Que diriez-vous quelque chose comme ceci:

#!/bin/bash 

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

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

pour cette solution:

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

qui se lit dans le fichier quand il trouve la chaîne de modèle, puis supprime la chaîne de modèle.

+0

Je reçois une erreur: sed: 1: "; d} \ n": caractères supplémentaires à la fin de la commande d – user170579

+0

@allentown : Cela fonctionne pour moi en utilisant GNU sed 4.2.1. Quelle version avez-vous (et quel OS et version)? –

+0

@ user170579: Essayez-le sans le point-virgule - certaines versions de 'sed' ne les aiment pas. –

0

awk

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

Peut-être un coup d'oeil à l'homme 1 ed ainsi:

# 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

Utiliser (FreeBSD) Sed faire quelque chose comme:

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

Vous devez échapper votre texte:

text=$(cat VERSION.header); 
escaped_text=$(echo "$text" | sed 's/[/\\&]/\\&/g;s/$/\\/;$s/\\$//') 
sed "s/_VERSION_HEADER_/$escaped_text/g" DOCUMENTATION