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.