2013-04-24 5 views
9

Ho questo comando sed per rimuovere gli spazi dopo le virgole.Utilizzare sed tra linee specifiche solo

sed -e 's/,\s\+/,/g' example.txt 

Come posso cambiarlo, eseguirà la modifica tra solo numeri di riga specifici.

(ad esempio tra la seconda e la terza riga).

+1

Linea 2,5 ......? –

+0

Questi numeri di linea specifici sono noti al momento in cui si richiama sed, o ci sono regioni nel file che dipendono dai dati stessi? Come la sed dovrebbe essere attiva solo tra alcuni marcatori di inizio e fine? In tal caso, userei 'awk', perché puoi mantenere variabili di stato tra le righe. –

risposta

17

Usa:

sed '2,3s/,\s\+/,/g' example.txt 
1
sed -e '2,3!b;s/,\s\+/,/g' example.txt 

Questa versione può essere utile se in seguito si desidera aggiungere altri comandi per elaborare le linee desiderate.

+2

Sospetto che ci siano buone informazioni qui. Ma devo ammettere che non seguo quello che sta succedendo. Non è ovvio per me perché '! B' e'; 'sono presenti e come sono utili in seguito. Forse puoi spiegare un po 'le cose. – jww

3

Dal OSX (BSD sed) presenta alcune differenze di sintassi a Linux (GNU) sed, ho pensato di aggiungere quanto segue da alcune note duramente conquistati miei:

OSX (BSD) SED trova/sostituisci all'interno del blocco (indirizzo) (inizio e modelli di punto finale (/../) o #s linea) in stesso file (via & via & via & sezione 4.20 here):

Sintassi:

$ sed '/start_pattern/,/end_pattern/ [operations]' [target filename] 

trovare Standard/sostituire esempi:

$ sed -i '' '2,3 s/,\s\+/,/g' example.txt 
$ sed -i '' '/DOCTYPE/,/body/ s/,\s\+/,/g' example.txt 

Trova/Sostituisci esempio con operatore complessa e raggruppamento (non può funzionare senza raggruppamento sintassi a causa di streaming uso di standard input). Tutte le dichiarazioni in raggruppamento devono essere su righe separate, o separati w/punti e virgola:

Complesso Esempio Operator (cancellerà tutta la riga contenente un match):

$ sed -i '' '2,3 {/pattern/d;}' example.txt 

multi-file di trovare + sed:

$ find ./ -type f -name '*.html' | xargs sed -i '' '/<head>/,/<\/head>/ {/pattern/d; /pattern2/d;}' 

Spero che questo aiuti qualcuno!