J'ai un fichier texte qui a une ligne particulière quelque chose comme
sometext sometext sometext TEXT_TO_BE_REPLACED sometext sometext sometext
Je dois remplacer toute la ligne ci-dessus par
This line is removed by the admin.
Le mot clé de recherche est TEXT_TO_BE_REPLACED
J'ai besoin d'écrire un script shell pour cela. Comment puis-je y parvenir en utilisant sed
?
Réponses:
Vous pouvez utiliser la commande change pour remplacer la ligne entière et l'
-i
indicateur pour effectuer les modifications sur place. Par exemple, en utilisant GNU sed:la source
c\
suivi direct d'une variable:…c\$VAR…
la barre oblique inversée échappera au dollar. Dans ce cas I (bash / sed sur Ubuntu 15.10) a dû écrire…c\\$VAR…
sed -i '' '/TEXT_TO_BE_REPLACED/c\This line is removed by the admin.' /tmp/foo
; (lorsque le premier paramètre est vide, il modifie le fichier, sinon crée une sauvegarde)Vous devez utiliser les caractères génériques (
.*
) avant et après pour remplacer toute la ligne:la source
sed -i -e "s/.*search_string.*/Replacement_line/' file_being_searched.txt
-i
optionLa réponse acceptée n'a pas fonctionné pour moi pour plusieurs raisons:
-i
avec une extension de longueur nullec\
commande est bizarre et je n'ai pas pu le faire fonctionnerVoici donc la solution que j'ai trouvée et qui devrait fonctionner dans la plupart des cas:
Ainsi, l'exemple d'utilisation pour résoudre le problème posé:
la source
La réponse ci-dessus:
Fonctionne bien si la chaîne / ligne de remplacement n'est pas une variable.
Le problème, c'est que sur Redhat 5
\
après, lesc
échappés$
. Un double\\
n'a pas fonctionné non plus (du moins sur Redhat 5).Grâce au hit et à l'essai, j'ai découvert que l'
\
afterc
est redondant si votre chaîne / ligne de remplacement n'est qu'une seule ligne. Donc je n'ai pas utilisé\
après lec
, j'ai utilisé une variable comme une seule ligne de remplacement et c'était de la joie.Le code ressemblerait à quelque chose comme:
Notez l'utilisation de guillemets doubles au lieu de guillemets simples.
la source
Toutes les réponses fournies jusqu'à présent supposent que vous savez quelque chose sur le texte à remplacer, ce qui est logique, car c'est ce que le PO a demandé. Je fournis une réponse qui suppose que vous ne savez rien du texte à remplacer et qu'il peut y avoir une ligne distincte dans le fichier avec le même contenu ou un contenu similaire que vous ne souhaitez pas remplacer. De plus, je suppose que vous connaissez le numéro de ligne de la ligne à remplacer.
Les exemples suivants illustrent la suppression ou la modification de texte par des numéros de ligne spécifiques:
la source
pour la manipulation des fichiers de configuration
j'ai trouvé cette solution inspirée par la réponse de skensell
configLine [searchPattern] [replaceLine] [filePath]
ce sera:
Fonction:
la magie du statut de sortie folle vient de https://stackoverflow.com/a/12145797/1262663
la source
ça fonctionne bien
la source
Dans mon makefile, j'utilise ceci:
PS: N'OUBLIEZ PAS que le -i change en fait le texte du fichier ... donc si le motif que vous avez défini comme "Révision" changera, vous changerez également le motif à remplacer.
Exemple de sortie:
Donc, si vous définissez le modèle "Révision: 1190", ce n'est évidemment pas la même chose que vous les avez définis comme "Révision:" seulement ...
la source
Le fichier find_replace contient 2 colonnes, c1 avec motif à correspondre, c2 avec remplacement, la boucle sed remplace chaque ligne contenant un des motifs de la variable 1
la source
sed
une fois avec un fichier de script contenant tous les remplacements que vous souhaitez effectuer. L'exécutionsed -i
répétée du même fichier est un horrible motif.Il est similaire à celui ci-dessus ..
la source
FOO=TEXT_TO_BE_REPLACED
enFOO=This line ...
donc ne répond pas aux spécifications.La commande ci-dessous fonctionne pour moi. Qui travaille avec des variables
la source
J'utilise très souvent regex pour extraire des données de fichiers que je viens d'utiliser pour remplacer la citation littérale
\"
par//
rien :-)la source