J'ai deux fichiers: file1
et file2
.
file1
a le contenu suivant:
---
host: "localhost"
port: 3000
reporter_type: "zookeeper"
zk_hosts:
- "localhost:2181"
file2
contient une adresse IP ( 1.1.1.1
)
Ce que je veux faire, c'est le remplacer localhost
par 1.1.1.1
, pour que le résultat final soit:
---
host: "1.1.1.1"
port: 3000
reporter_type: "zookeeper"
zk_hosts:
- "1.1.1.1:2181"
J'ai essayé:
sed -i -e "/localhost/r file2" -e "/localhost/d" file1
sed '/localhost/r file2' file1 |sed '/localhost/d'
sed -e '/localhost/r file2' -e "s///" file1
Mais soit je fais remplacer la ligne entière, soit l'adresse IP va à la ligne après celle que je dois modifier.
text-processing
sed
Jay Kah
la source
la source
cat file1 | sed -e 's/localhost/1.1.1.1/g'
marche?\r
commande sed.Réponses:
Voici une
sed
solution:Vous devez utiliser
sed -i
pour effectuer le changement sur place.Si vous pouvez utiliser
awk
, voici une façon de procéder:la source
awk
. J'imaginesed
est capable de cela, mais ce sera terriblement maladroit. C'est là queawk
brille!sed
solution doit être entre guillemets au cas où le fichier contient des espaces ou des caractères globaux./
et&
dans la substitution. C'est"$(sed 's:[/\\&]:\\&:g' file2)"
Vous pouvez lire le fichier avec la chaîne de remplacement en utilisant la substitution de commandes shell, avant de l'
sed
utiliser. Donc,sed
ne verra qu'une substitution normale:sed "s/localhost/$(cat file2)/" file1 > changed.txt
la source
Essayez d'utiliser
puis supprimez tous les champs indésirables.
la source
J'ai également eu ce "problème" aujourd'hui: comment remplacer un bloc de texte par le contenu d'un autre fichier.
Je l'ai résolu en créant une fonction bash (qui peut être réutilisée dans des scripts).
la source