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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.