2013-01-03 11 views
14

Ho un file Java. Voglio commentare qualsiasi riga di codice che contiene il match:Utilizzo di sed per sostituire l'inizio della riga quando viene trovata una corrispondenza

myvar 

Penso sed mi deve dare una mano qui

sed 's/myVar/not_sure_what_to_put_here/g' MyFile.java 

Non so cosa mettere in:

not_sure_what_to_put_here 

come in questo caso, non voglio sostituire myVar ma la voglio inserire

// 

all'inizio di qualsiasi riga su cui si verifica myVar.

Eventuali suggerimenti

+0

finora entrambe le risposte di seguito faranno il lavoro per voi. Vorrei ricordarti che devi perfezionare il tuo pattern "myvar" per evitare che si verifichi una sostituzione inaspettata. per esempio. tutte le righe contenenti "myVariable o myVarList o myVarMap o Object obj = new Object; // myVar nel commento" verranno commentate. – Kent

+0

@Kent buon punto. Dovrebbe essere il più stretto possibile. – dublintech

risposta

32

Cattura tutta la riga che contiene myvar:

$ sed 's/\(^.*myvar.*$\)/\/\/\1/' file 

$ cat hw.java 
class hw { 
    public static void main(String[] args) { 
     System.out.println("Hello World!"); 
     myvar=1 
    } 
} 

$ sed 's/\(^.*myvar.*$\)/\/\/\1/' hw.java 
class hw { 
    public static void main(String[] args) { 
     System.out.println("Hello World!"); 
//  myvar=1 
    } 
} 

Utilizzare l'opzione -i per salvare le modifiche nel file sed -i 's/\(^.*myvar.*$\)/\/\/\1/' file.

Spiegazione:

(  # Start a capture group 
^  # Matches the start of the line 
.*  # Matches anything 
myvar # Matches the literal word 
.*  # Matches anything 
$  # Matches the end of the line 
)  # End capture group 

Quindi questo guarda tutta la linea e se myvar è trovato i risultati in immagazzinata nel primo gruppo di cattura, di cui un \1. Quindi sostituiamo l'intera riga \1 con l'intera riga preceduta da 2 barre in avanti //\1 ovviamente il forwardslashes necessita di escape per non confondere sed quindi \/\/\1 nota anche che le parentesi necessitano di escape a meno che non si usi l'opzione regex estesa di sed.

+0

questo sta guardando bene. Q1 puoi spiegare la logica della tua risposta? vale a dire che cosa fa /.((.* ecc.? – dublintech

+0

@dublintech vedi edit. –

+2

geniale! Volevo solo capire e non solo fare la cosa .Grande risposta. – dublintech

3

Prova:

sed -n '/myVar/{s|^|//|};p' MyFile.java 

che significa: quando una riga contiene myVar, sostituire l'inizio della linea con //.

+0

Sono su windwons, il | diventa | e ottengo: '|' non è riconosciuto come comando interno o esterno, – dublintech

+0

ok, quindi dovrai usare barre di escape: 'sed -n '/ mioVar/{s/^/\/\ // }; p 'MyFile.java' – dogbane

+0

Oppure metti lo script in un file se il tuo (miserabile naufragio di una scusa per un) sistema operativo non offre un modo per citare una stringa letterale.Forse le doppie virgolette invece del singolo funzionerebbero, comunque. – tripleee

2

ero alla ricerca lo stesso argomento e ho trovato questa soluzione che è più semplice in termini di espressione regolare

sed -e '/myvar/ s/^/\/\//' file

Questo aggiunge // alla colonna 0 della linea con il pattern matching.

Tuttavia, stavo cercando una soluzione che mi consenta di aggiungere un carattere prima del primo carattere della linea (non sulla colonna 0).

Problemi correlati