2012-11-21 11 views
6

Sto eseguendo sed come parte di uno script di shell per pulire i registri di bind per l'inserimento in un database.Limitazione SED ai primi 10 caratteri di una riga

Uno dei comandi sed è la seguente:

sed -i 's/-/:/g' $DPath/named.query.log 

Questo si rivela essere problematico, in quanto interrompe eventuali richieste di risorse che includono anche un trattino (sto usando: come delimitatore per un'istruzione awk più in basso).

La mia domanda è come limitare il comando sed sopra solo ai primi dieci caratteri della linea? Non ho visto un interruttore specifico che faccia questo, e non sono neanche lontanamente abbastanza bravo con RegEx per iniziare a sviluppare uno che funzioni. Non posso semplicemente usare regex per abbinare i numeri precedenti perché è possibile che il pattern possa far parte di una richiesta di risorsa. Diamine, non posso nemmeno usare la corrispondenza dei modelli per #### - ## - ## perché, ancora una volta, potrebbe essere parte della risorsa.

Tutte le idee sono molto apprezzate.

risposta

2

E '[quasi sempre] semplice con awk:

awk '{target=substr($0,1,10); gsub(/-/,":",target); print target substr($0,11)}' file 
+0

Signore, penso che lo farò. Grazie mille! – MikeH

+2

Supporta anche (non verificato) 'perl -pe '($ _, 0, 10) = ~ s /:/-/g' file – tripleee

+0

@ tripleee: Il tuo commento (non testato) non funziona per me (ma io non so perl). –

0

È possibile effettuare le seguenti operazioni:

cut -c 1-10 $DPath/named.query.log | sed -i 's/-/:/g' 

Lo statemnt taglio prende solo i primi 10 caratteri di ciascuna linea in quel file. L'output di quello dovrebbe essere convogliato in un file. A partire da ora sarà solo in uscita sul terminale

+2

Credo che il PO ha voluto modificare "-" s solo nei primi 10 caratteri di una linea più lunga, non tronca la linea a 10 caratteri e quindi modificare tutti " -"S. Inoltre, mi chiedo che cosa farà "-i" di sed con nessun file da modificare .... –

1

io non sono sicuro di come rendere sed fai da sé, però, so che voi può alimentare sed i primi 10 caratteri quindi incollare il resto indietro, in questo modo:

paste -d"\0" <(cut -c1-10 $DPath/named.query.log | sed 's/\-/:/g') <(cut -c11- $DPath/named.query.log)

+0

Questo sputa l'output sullo schermo piuttosto che nel file, ma potrebbe funzionare anche così. Grazie per il post :) :) – MikeH

2

Penso che la soluzione più breve, e forse la più semplice, è fornito da sé sed, piuttosto che awk [reparto]:

sed "h;s/-/:/g;G;s/\(..........\).*\n........../\1/" 

Spiegazione:

  • (h) copia tutto lo spazio stiva
  • (s) fare la sostituzione (all'intero spazio modello)
  • (G) aggiungere il hold space, con un separatore \n
  • (s) eliminare i caratteri fino al decimo dopo lo \n, ma mantenere i primi dieci.

Alcuni codice di prova:

echo "--------------------------------" > foo 
sed -i "h;s/-/:/g;G;s/\(..........\).*\n........../\1/" foo 
cat foo 
::::::::::---------------------- 
+1

Buono! Forse un leggero miglioramento 'sed 'h; y/- /: /; G; s/^ \ (. \ {10 \} \). * \ N. \ {10 \}/\ 1 /'' – potong

+0

@potong : Sì hai ragione. * Ma * alcuni sistemi precedenti non supportano questa sintassi. * E * è meno chiaro. –

+0

@potong: Ma la tua soluzione è * più breve * della mia, di sette caratteri (ignorando l'inutile ^). Il 'y' ha salvato un personaggio. –

Problemi correlati