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
.
fonte
2013-01-03 10:53:46
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
@Kent buon punto. Dovrebbe essere il più stretto possibile. – dublintech