Przypisz wartości do zmiennej z pliku tekstowego. Wyszukaj ciąg w pliku. Zastąpić ciąg w pliku?

0

Pracuję nad projektem, w którym muszę poprawić kilka tysięcy wierszy danych. Skończyłem już połowę pracy i teraz utknąłem w końcowej części.

Mam plik o nazwie tree.txt, który zawiera listę wszystkich węzłów, jednak z powodu jakiegoś błędu lub czegoś wiele węzłów ma niepoprawną nazwę znacznika. 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

Jak widać powyżej, nazwa węzła BA-03 i BA-04 jest niepoprawna, więc użycie obsługi plików w CI było w stanie poprawić ten plik tekstowy, a także wydrukować wszystkie niepoprawne znaczniki odpowiednich węzłów w pliku, jak poniżej. niepoprawne_tagis.txt-

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

Ostatnią rzeczą jest to, że istnieje wiele innych plików, w których użyto niepoprawnej nazwy znacznika i muszę zastąpić wszystkie niepoprawne znaczniki prawidłowym.

Moje podejście do rozwiązania problemu to ->

  1. Będę miał dwa zmienne node i tag , te dwie zmienne dostaną tam dane z powyższego niepoprawnego tag_tag.txt . Wyszukam wartość tagu w każdym pliku i zastąpię ją wartością odpowiedniego węzła.
  2. Po zakończeniu wyszukiwania i zamianie pierwszego znacznika we wszystkich plikach zrobi to samo dla pozostałych.

Jednak z powodu mojej ograniczonej wiedzy nie wiem, czy jest to możliwe, czy nie. Nawet jeśli otrzymam pomoc dotyczącą składni, będę mógł odpocząć. Dzięki

Edytować-

Inne pliki, w których muszę wyszukiwać i zamieniać dane, są różne .. np. 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:

Istnieje blisko 2000 plików .j1, w których przeszukam nazwę każdego tagu we wszystkich plikach .j1 i zastąpię go poprawną nazwą lub węzłem.

gadhvi
źródło
Czy wszystko, co próbujesz zrobić, to wziąć każdy plik (np. Main_Overview / Ballast / BA-04) i przeszukać i zastąpić BA-02-2 -> BA-04 w tym pliku?
davidgo
Chcesz powiedzieć, że Main_Overview / Ballast / BA-03: Tag = BA-02-1 powinien zostać przepisany jak Main_Overview / Ballast / BA-03: Tag = BA-03 i inne powinny, Main_Overview / Ballast / BA- 04: Tag = BA-04?
Rajesh S
@ davigo Muszę tylko wymienić wszystkie niepoprawne nazwy znaczników obecne w innych plikach, o których teraz wspomniałem, ponieważ najpierw muszę wiedzieć, które są nieprawidłowe i jaka jest dokładnie poprawna nazwa. Utworzyłem plik tekstowy wspomniany w drugim bloku, który zawiera najpierw starą nazwę znacznika, a następnie nową nazwę znacznika.
gadhvi

Odpowiedzi:

1

Po prostu tego szukasz?

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

(Spróbuj bez -iwyświetlania wyniku bez zapisywania go z powrotem do oryginalnego pliku - potoku do less, abyś mógł wstrzymywać i przewijać w przód i w tył).

Nawiasy w pierwszym wyrażeniu szukają ciągu między ukośnikiem a dwukropkiem; jeśli znajdziemy to zaraz po nim Tag=i ten sam ciąg znaków, który pasował między nawiasami, jesteśmy dobrzy. Nawiasy odwrócone z nawiasami przechwytują ten ciąg, abyśmy mogli odwołać się do niego jako \1.

Jeśli nie znaleźliśmy tego wzorca, łańcuch po nim Tag=musi być inny niż łańcuch przechwycony; jeśli tak, zamień ciąg Tag=na przechwycony. Wyrażenie regularne zastępuje sekwencję, która zawiera pojedynczy myślnik, a w przeciwnym razie nie ma myślników, dwukropków ani ukośników (czyli do tuż przed drugim myślnikiem lub pierwszym ukośnikiem lub dwukropkiem).

Jeśli korzystasz z * BSD (w tym Mac OS), potrzebujesz -i ''zamiast tego -i.

Aby zastosować inne podejście, możesz ponownie przypisać mapowania do sedskryptu. Jeśli masz plik incorrect_tags.txtpodobny do

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

następnie możesz uruchomić następujący skrypt

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

który tworzy ... kolejny sedskrypt, który teraz wygląda

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

który możesz przekazać do innej instancji w sedcelu zmodyfikowania plików zawierających te tokeny, które chcesz zastąpić.

Pełny rurociąg jest wtedy

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

i znowu możesz spróbować bez -iuprzedniego sprawdzenia, jak wygląda wyjście. Ponadto opcja sedmoże Ci się nie podobać -flub może nie obsługiwać czytania skryptu na standardowym wejściu; być może po prostu zapisz dane wyjściowe z pierwszego sedwywołania w pliku tymczasowym, a następnie podaj nazwę pliku tymczasowego jako argument nazwy pliku -f.

Zauważ, że będzie to wymagało, aby tagi nie zachodziły na siebie - jeśli najpierw zamienisz A na B, a następnie B na C, wynik końcowy będzie taki, jakbyś określił „A” „C”. Obejściem tego problemu jest zmiana kolejności, tak aby najpierw B zastąpiono C, a dopiero potem A B.

potrójny
źródło
Dzięki, ale już zrobiłem tę część przy użyciu C, ostatnią pozostałą częścią jest to, że muszę zastąpić te stare niepoprawne nazwy znaczników nowymi, ale te pliki są inne, wspomniałem o tym teraz i są prawie 2k plików.
gadhvi
Zobacz aktualizację teraz. Używanie C do tego rodzaju rzeczy jest prawdopodobnie źle przekierowane, ale jeśli już to zrobiłeś, równie dobrze możesz użyć wyników.
tripleee
dzięki tonie, nigdy nie myślałem, że sed jest tak potężny, że będę musiał dowiedzieć się więcej.
gadhvi