Assegna valori alla variabile dal file di testo. Cerca la stringa nel file. Sostituisci la stringa nel file?


0

Sto lavorando a un progetto in cui devo correggere alcune migliaia di righe di dati. Ho già completato la metà del lavoro e ora sono bloccato sulla parte finale.

Ho un file chiamato tree.txt che ha un elenco di tutti i nodi, tuttavia a causa di qualche bug o qualcosa che molti nodi hanno un nome tag errato. tree.txt-

Main_Overview/Ballast/BA-02:Tag=BA-02
Main_Overview/Ballast/BA-03:Tag=BA-02-1
Main_Overview/Ballast/BA-04:Tag=BA-02-2

Come visto sopra, il nome del tag del nodo BA-03 e BA-04 non è corretto, quindi l'utilizzo del file Handling in CI è stato in grado di correggere questo file di testo e anche stampare tutti i tag errati dei rispettivi nodi nel file come di seguito. incorrect_tags.txt-

"BA-02-1" "BA-03"
"BA-02-2" "BA-04"

Ora l'ultima cosa è che ci sono molti altri file in cui viene utilizzato un nome di tag errato e ho bisogno di sostituire tutti quei tag errati con uno corretto.

Il mio approccio per risolvere il problema è ->

  1. Avrò due variabili nodo e tag , queste due variabili ci porteranno i dati da sopra wrong_tag.txt . Cercherò il valore del tag in ciascun file e lo sostituirò con il valore del rispettivo nodo.
  2. Una volta terminata la ricerca e la sostituzione del primo tag in tutti i file, farà lo stesso per quelli rimanenti.

Tuttavia, a causa della mia limitata conoscenza, non so se sia possibile o meno. Inoltre, anche se avessi un po 'di aiuto sulla sintassi, sarei in grado di riposare. Grazie

Modificare-

Gli altri file in cui devo cercare e sostituire i dati sono diversi .. ad esempio Ballast.j1

:1176:489:15:30:CompID=118680:Text=BA-02:uiFont=Arial-PLAIN-10: 
:1269:489:15:30:CompID=118681:Text=BA-02-1:uiFont=Arial-PLAIN-10:
:1013:489:15:30:CompID=118677:Text=BA-02-2:uiFont=Arial-PLAIN-10:

Ci sono quasi 2000 file .j1 in cui cercherò ogni nome di tag in tutti quei file .j1 e lo sostituirò con il nome o il nodo tag corretto.


Tutto quello che stai cercando di fare è prendere ogni file (ad esempio Main_Overview / Ballast / BA-04) e fare una ricerca e sostituire BA-02-2 -> BA-04 in quel file?
davidgo,

Intendi dire che Main_Overview / Ballast / BA-03: Tag = BA-02-1 dovrebbe essere riscritto come, Main_Overview / Ballast / BA-03: Tag = BA-03 e altri dovrebbero, Main_Overview / Ballast / BA- 04: Tag = BA-04?
Rajesh S,

@davigo Ho solo bisogno di sostituire tutti i nomi di tag errati presenti in altri file che ho citato ora, poiché devo prima sapere quali sono errati e qual è il nome esatto corretto. Ho creato il file di testo menzionato nel secondo blocco che contiene il primo nome di tag vecchio e quindi il nuovo nome di tag.
gadhvi,

Risposte:


1

Stai semplicemente cercando questo?

sed -i '\%/\([^/:]*\):Tag=\1%n;s%%/\(\([^/:]*\):Tag=\)[^/:-]*-[^/:-]*%\1\2%' *.j1

(Provate senza -iper vedere l'output senza riscriverlo nel file originale - pipe in lessmodo da poter mettere in pausa e scorrere avanti e indietro.)

Le parentesi nella prima espressione cercano una stringa tra una barra e due punti; se lo troviamo immediatamente seguito da Tag=e la stessa stringa di quella corrispondente tra parentesi, siamo a posto. Le parentesi rovesciate catturano questa stringa in modo che possiamo fare riferimento ad essa come \1.

Se non abbiamo trovato questo modello, la stringa successiva Tag=deve essere diversa dalla stringa acquisita; in tal caso, sostituire la stringa dopo Tag=con la stringa acquisita. L'espressione regolare sostituisce una sequenza che contiene un singolo trattino e altrimenti nessun trattino, due punti o barre (quindi fino a poco prima del secondo trattino o della prima barra o due punti).

Se utilizzi * BSD (incluso Mac OS) devi -i ''invece solo -i.

Per un altro approccio, puoi refactoring i tuoi mapping in uno sedscript. Se hai un file incorrect_tags.txtcome

"BA-02-1" "BA-03"
"BA-02-2" "BA-04"

quindi è possibile eseguire il seguente script

sed 's%^"%s/%;s%" "%/%;s%"$%/g%' incorrect_tags.txt

che produce ... un'altra sedsceneggiatura che ora sembra

s/BA-02-1/BA-03/g
s/BA-02-2/BA-04/g

che è possibile passare a un'altra istanza di sedper modificare i file che contengono questi token che si desidera sostituire.

La pipeline completa è quindi

sed 's%^"%s/%;s%" "%/%;s%"$%/g%' incorrect_tags.txt |
sed -i -f - *.j1

e ancora, potresti voler provare senza -iprima vedere come appare l'output. Inoltre, sedl' -fopzione potrebbe non piacerti o potrebbe non supportare la lettura di uno script con input standard; forse quindi semplicemente salvare l'output dalla prima sedchiamata in un file temporaneo e quindi assegnare il nome del file temporaneo come argomento del nome del file -f.

Nota che questo richiederà che i tag non siano sovrapposti: se prima sostituisci A con B e poi B con C, il risultato finale sarà come se avessi specificato "A" "C". Una soluzione alternativa consiste nel cambiare l'ordine in modo che B venga sostituito prima con C e solo successivamente A con B.


Grazie, ma ho già fatto questa parte usando C, l'ultima parte rimanente è che ho bisogno di sostituire quei vecchi nomi di tag errati con quelli nuovi, ma quei file sono diversi, l'ho menzionato ora e ci sono quasi 2k file.
gadhvi,

Vedi aggiornamento ora. L'uso di C per questo genere di cose è probabilmente indirizzato erroneamente, ma se hai già fatto quel lavoro, potresti anche usare i risultati.
tripleee,

grazie mille, non avrei mai pensato che sed fosse così potente che avrò bisogno di saperne di più.
gadhvi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.