2013-11-02 14 views
5

Se ho la lista seguente in un file:Sed: Come sostituire una stringa trovato dopo un modello specifico si trova in un file

integer, parameter :: ni = 1024 
integer, parameter :: nj = 256 
integer, parameter :: nk = 16 

e voglio cercare in base alla stringa 'ni =', e quindi sostituire la stringa che segue (in questo caso '1024') con una nuova stringa come '512' ad esempio (vorrei conservare lo spazio). Come posso usare sed per questo? Nota che vorrei semplicemente cancellare tutto ciò che viene dopo il segno di uguale, questo perché a volte la stringa non sarà un semplice numero intero, potrebbe essere qualcosa come "1.D0". E in alcuni casi potrebbero esserci dei commenti in anticipo. Quindi voglio solo cancellare ciò che è davanti al segno di uguale e sostituirlo con il nuovo valore.

Il risultato sarebbe:

integer, parameter :: ni = 512 
integer, parameter :: nj = 256 
integer, parameter :: nk = 16 

risposta

9

supporti GNU sed esteso le espressioni regolari se si dà la bandiera -r.

sed -re 's/(:: ni =)[^=]*$/\1 512/' file 

Ancora meglio, abbinare per più spazi.

sed -re 's/(::\s+ni\s+=)[^=]*$/\1 512/' file 

Il \1 è un riferimento a ciò che è abbinato tra parentesi (), quindi sostituiamo con \1 e un nuovo valore.

1
sed -e 's/:: ni = [0-9][0-9]*$/:: ni = 512/' 

questo sembra plausibile per il contesto intorno alla partita specificata per ridurre al minimo la possibilità di trovare ni da qualche parte in un'altra stringa.

+0

è meglio scrivere 'sed -e 's/:: ni = [0-9] + $/:: ni = 512 /'' –

+0

@AntonAstafiev: questo dipende da quanto si desidera che il codice funzioni. Alcune varianti di 'sed' supportano' + 'senza ulteriori opzioni; molti non lo fanno e POSIX non richiede loro di farlo. Potresti usare '[0-9] \ {1, \}' per farlo, ma ciò che ho scritto è più facilmente comprensibile. –

3

Se ho capito bene, qualcosa di simile a questo dovrebbe farlo:

sed 's/\(ni = \).*/\1REPLACEMENT/'

Problemi correlati