379 votes

Remplacer une ligne entière contenant une chaîne de caractères en utilisant Sed

J'ai un fichier texte qui contient une ligne particulière, du genre

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 la recherche est TEXT_TO_BE_REPLACED

Je dois écrire un shell script pour cela. Comment puis-je y parvenir en utilisant sed ?

4voto

Grain Points 1

pour la manipulation des fichiers de configuration

J'ai trouvé cette solution en m'inspirant de réponse de skensell

configLine [searchPattern] [replaceLine] [filePath]

il le fera :

  • créer le fichier s'il n'existe pas
  • remplacer la ligne entière (toutes les lignes) où modèle de recherche jumelé
  • ajouter replaceLine à la fin du fichier si le motif n'a pas été trouvé

Fonction :

function configLine {
  local OLD_LINE_PATTERN=$1; shift
  local NEW_LINE=$1; shift
  local FILE=$1
  local NEW=$(echo "${NEW_LINE}" | sed 's/\//\\\//g')
  touch "${FILE}"
  sed -i '/'"${OLD_LINE_PATTERN}"'/{s/.*/'"${NEW}"'/;h};${x;/./{x;q100};x}' "${FILE}"
  if [[ $? -ne 100 ]] && [[ ${NEW_LINE} != '' ]]
  then
    echo "${NEW_LINE}" >> "${FILE}"
  fi
}

la magie folle du statut de sortie vient de https://stackoverflow.com/a/12145797/1262663

2voto

Martin Pfeffer Points 85

Dans mon makefile, j'utilise ceci :

@sed -i '/.*Revision:.*/c\'"`svn info -R main.cpp | awk '/^Rev/'`"'' README.md

PS : NE PAS oubliez que le -i modifie en fait le texte dans le fichier... donc si le motif que vous avez défini comme "Révision" va changer, vous allez aussi changer le motif à remplacer.

Exemple de sortie :

Abc-Project écrit par John Doe

Révision : 1190

Ainsi, si vous définissez le motif "Révision : 1190", ce n'est évidemment pas la même chose que si vous les définissiez uniquement comme "Révision :"...

2voto

nkl Points 21
bash-4.1$ new_db_host="DB_HOSTNAME=good replaced with 122.334.567.90"
bash-4.1$ 
bash-4.1$ sed -i "/DB_HOST/c $new_db_host" test4sed
vim test4sed
'
'
'
DB_HOSTNAME=good replaced with 122.334.567.90
'

il fonctionne bien

1voto

sjordi Points 19
cat find_replace | while read pattern replacement ; do
sed -i "/${pattern}/c ${replacement}" file    
done 

Le fichier find_replace contient 2 colonnes, c1 avec le modèle à correspondre, c2 avec le remplacement, la boucle sed remplace chaque ligne contenant un des modèles de la variable 1.

1voto

Benjamin W. Points 19035

Pour faire cela sans s'appuyer sur des GNUismes tels que -i sans paramètre ou c sans saut de ligne :

sed '/TEXT_TO_BE_REPLACED/c\
This line is removed by the admin.
' infile > tmpfile && mv tmpfile infile

Dans cette forme (conforme à POSIX) de la commande

c\
text

text peut consister en une ou plusieurs lignes, et les sauts de ligne qui doivent faire partie du remplacement doivent être échappés :

c\
line1\
line2
s/x/y/

s/x/y/ est une nouvelle commande sed après que l'espace du motif ait été remplacé par les deux lignes suivantes

line1
line2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X