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
3 Réponses :
$ 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
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 code> ne fonctionnait pas.
Créer un fichier, Appliquez-le à vos données: p> script.sed.Sed. / code>, contenant:
sed -f script.sed your_data
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 $." Code>, 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 code> code>. Pour le texte brut, mettez simplement tout le script à l'intérieur de citations simples. Vous avez besoin des backslashes -
sed code> 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.
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
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
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.