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 ->
- 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.
- 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.
Odpowiedzi:
Po prostu tego szukasz?
(Spróbuj bez
-i
wyświetlania wyniku bez zapisywania go z powrotem do oryginalnego pliku - potoku doless
, 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ągTag=
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
sed
skryptu. Jeśli masz plikincorrect_tags.txt
podobny donastępnie możesz uruchomić następujący skrypt
który tworzy ... kolejny
sed
skrypt, który teraz wyglądaktóry możesz przekazać do innej instancji w
sed
celu zmodyfikowania plików zawierających te tokeny, które chcesz zastąpić.Pełny rurociąg jest wtedy
i znowu możesz spróbować bez
-i
uprzedniego sprawdzenia, jak wygląda wyjście. Ponadto opcjased
może Ci się nie podobać-f
lub może nie obsługiwać czytania skryptu na standardowym wejściu; być może po prostu zapisz dane wyjściowe z pierwszegosed
wywoł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.
źródło