10
votes

Substituer une seule ligne avec plusieurs lignes de texte

in Linux Quelle commande puis-je utiliser pour remplacer une seule ligne de texte avec de nouvelles lignes multiples? Je veux rechercher un mot-clé sur une ligne et supprimer cette ligne et la remplacer par plusieurs nouvelles lignes. Donc, dans le texte présenté ci-dessous, je souhaite rechercher la ligne contenant "mot-clé" et remplacer la ligne entière avec 3 nouvelles lignes de texte comme indiqué.

par exemple remplaçant la ligne contenant le mot-clé, P>

This is Line 1
Inserted is new first line
Inserted is new second line
Inserted is new third line
This is Line 3


4 commentaires

Avez-vous l'intention de remplacer un numéro de ligne spécifique ou la (des) ligne (s) correspondant à "^ Ceci est la ligne 2 $"? L'un ou l'autre peut être fait avec SED


Les lignes correspondantes. Je ne sais pas trop comment remplacer une seule ligne de correspondance avec plusieurs lignes comme indiqué avec SED.


J'ai mis à jour l'original pour la clarté.


Après avoir examiné SAD soigneusement, j'ai découvert SED contient une option C pour changer la ligne de courant et cela fonctionne parfaitement.


3 Réponses :


13
votes
$ sed '/keyword/c\
> Inserted is new first line\
> Inserted is new second line\
> Inserted is new third line' input.txt

This is Line 1
Inserted is new first line
Inserted is new second line
Inserted is new third line
This is Line 3
$ and > are bash prompt

2 commentaires

Comment pouvez-vous le faire pour que, après une heure qui se soit écoulé avec personne ne répondant à la question, vous parvenez à soumettre votre réponse à une minute devant la mienne!


Merci! Cela me conduisait Bat-Dung Crazy B / C \ N ne fonctionnait pas.



8
votes

Créer un fichier, script.sed.Sed. / code>, contenant: xxx pré>

Appliquez-le à vos données: p>

sed -f script.sed your_data


3 commentaires

Cela peut-il être intégré à un seul script Bash? Je préférerais le garder à un fichier.


@Flicgerfly: Oui, cela peut être fait sans le fichier séparé. Il est généralement plus facile avec le fichier, cependant. Cela dépend en partie de ce qui est dans les lignes à insérer, mais s'ils incluent un texte tel que il a dit: «Ne le faites pas! Vous ne devez pas, même pour 100 $." , la manipulation de ce Dans un script shell devient une véritable douleur (vous devez échapper à certaines citations, en quelque sorte), mais c'est presque trivial avec le fichier distinct du script . Pour le texte brut, mettez simplement tout le script à l'intérieur de citations simples. Vous avez besoin des backslashes - sed doit les voir. Si vous devez utiliser des guillemets doubles, vous devrez doubler les backslashes.


Incidemment, kev 's Réponse montre comment il peut être fait dans un seul script, sans une discussion approfondie des shenanigans qui pourraient être nécessaires si le texte de remplacement contient des caractères de devis.



1
votes

Vous pouvez également le faire à l'aide de Shell comduries également:

STRING1_WITH_MULTIPLE_LINES="your
text
here"

STRING2_WITH_MULTIPLE_LINES="more
text"

OUTPUT=""
while read LINE || [ "$LINE" ]; do
  case "$LINE" in
    "Entire line matches this")OUTPUT="$OUTPUT$STRING1_WITH_MULTIPLE_LINES
";;
    *"line matches this with extra before and/or after"*)OUTPUT="$OUTPUT$STRING2_WITH_MULTIPLE_LINES
";;
    *)OUTPUT="$OUTPUT$LINE
";;
  esac
done < file
echo "$OUTPUT" >file


1 commentaires

Vous n'avez pas besoin de configurer les cordes comme variables en dehors du bloc de cas de lecture tandis que ... ils peuvent simplement être émis = "$ OutputYour \ ntext \ nhere" ... Remplacement des \ n avec des nouvelles lignes réelles