Come inserire il testo dopo una determinata stringa in un file?


69

In questo momento sto usando echo "Hello World" >> file.txtper aggiungere del testo ad un file ma devo anche aggiungere del testo sotto una certa stringa diciamo "[opzione]", è possibile con sed?

PER ESEMPIO:

File di input

Some text
Random
[option]
Some stuff

File di uscita

Some text
Random
[option]
*inserted text*
Some stuff

1
Devi essere più specifico e fornire un testo di esempio affinché le persone ti aiutino con comandi esatti.
— Clemente,

per favore, modifica la tua Q e mostra inputle outputlinee e. Perché Q non è chiaro. Potresti anche farlo echo "Hello World [option]" >> file.txt, ma non ha senso.

Ho modificato la domanda per fornire ulteriori informazioni come riferimento, ma la risposta accettata era ciò che stavo cercando di realizzare
— Javier Villanueva,

Se vuoi solo modificare un file di configurazione, questa è la soluzione migliore che ho trovato: unix.stackexchange.com/a/78076/20661
— rubo77

Risposte:


104

Aggiungi riga dopo partita

  • sed '/\[option\]/a Hello World' input

Inserisci la riga prima della corrispondenza

  • sed '/\[option\]/i Hello World' input

Inoltre, è possibile eseguire il backup e modificare il file di input sul posto utilizzando l' -i.bkpopzione sed


2
su osx ottengosed: 1: "/pattern/a some text here": command a expects \ followed by text
— the_prole il


per Mac OSX, dovevo aggiungere \ <<NEWLINE>>dopo l' aopzione
— Tom Howard il

Il codice sopra aggiungerà / inserirà la riga per ogni singola corrispondenza. Se si desidera aggiungere / inserire la riga solo per la prima corrispondenza, è possibile anteporre 0,ai comandi: sed '0,/\[option\]/a Hello World' inputoppuresed '0,/\[option\]/i Hello World' input
— kimbaudi

33

Sì, è possibile con sed:

sed '/pattern/a some text here' filename

Un esempio:

$ cat test
foo
bar
option
baz
$ sed '/option/a insert text here' test
foo
bar
option
insert text here
baz
$

2
@javiervd Non sono sicuro di cosa intendevi per prima risposta? Se intendevi prima per risposta, allora ti sbagli. Non hai osservato attentamente i timestamp!
— Devnull

C'è un modo per aggiungerlo dopo l'ultima stringa abbinata? Ad esempio: foo bar option bar option baz . Quindi lo schema diventa foo bar option bar option addedstring baz ?
— Ari,

4

Con awk:

awk '1;/PATTERN/{ print "add one line"; print "\\and one more"}' infile

Tieni presente che alcuni caratteri non possono essere inclusi letteralmente, quindi è necessario utilizzare sequenze di escape (iniziano con una barra rovesciata), ad esempio per stampare una barra rovesciata letterale che si deve scrivere \\.

In realtà è la stessa cosa, sedma in aggiunta ogni nuova riga incorporata nel testo deve essere preceduta da una barra rovesciata:

sed '/PATTERN/a\
add one line\
\\and one more' infile

Per maggiori dettagli sulle sequenze di escape consultare il manuale.


Una riga awk in realtà non modifica il testo, ma solo l'output.
— Josef Klimuk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.