Próbuję znaleźć sposób na określenie różnicy między dwoma ciągami znaków w moim skrypcie. Mógłbym to łatwo zrobić za pomocą diff lub comm, ale nie mam do czynienia z plikami i wolałbym nie wyprowadzać ich do plików, zrobić porównanie i odczytać je z powrotem.
Widzę, że wszystkie polecenia comm, diff, cmp pozwalają na przekazanie dwóch plików LUB pliku i standardowego wejścia - myślę, że to dobrze, jeśli nie chcę wyprowadzać dwóch plików ... ale nadal jest do bani.
Grzebałem w kółko myśląc, że mogę użyć grep lub wyrażeń regularnych - ale chyba nie.
Odpowiedzi:
Używając
diff
lubcom
cokolwiek chcesz:Greg's Bash FAQ: Zastępowanie procesów
lub z nazwaną potoką
Greg's Bash FAQ: Praca z nazwanymi potokami
Nazwany potok jest również znany jako FIFO.
Sam
-
w sobie jest przeznaczony dla standardowego wejścia.<<<
jest „ciągiem tutaj”.&
jest jak,;
ale umieszcza to w tleźródło
FUNC(){ echo "$@"; "$@"; }; FUNC diff <(echo a) <(echo b);
$ diff <(echo "Here are the letters in String One.") <(echo "Here are the characters in String Two.")
\n
1c1
\n
< Here are the letters in String One.
\n
---
\n
> Here are the characters in String Two.
\n
Używanie potoku jest podobne, z tym że pokazuje numer procesu, zaczyna się1c1
od następnego$
i czeka, aż naciśniesz <kbd> Enter <kbd> (lub możesz wykonać inne polecenia ...)Przypomina mi to pytanie: Jak można porównać dwa rurociągi w Bash?
Jeśli jesteś w sesji bash, możesz wykonać:
z
<
tworzeniem anonimowych nazwanych potoków - zarządzanych przez bash - dzięki czemu są one tworzone i niszczone automatycznie, w przeciwieństwie do plików tymczasowych.Więc jeśli uda Ci się wyodrębnić dwa różne ciągi jako część polecenia (grep, awk, sed, ...), możesz zrobić - na przykład - coś takiego:
(jeśli przypuszczasz, że masz w pliku takie linie jak
string1=very_complicated_value
i astring2=another_long_and_complicated_value'
: bez znajomości wewnętrznego formatu pliku nie mogę polecić dokładnego polecenia)źródło
Wolę
cmp
i funkcję zastępowania procesów w bash:Mówiąc na pozycji 2, ab występuje w pierwszej, ale aq w drugiej. Na pozycji 5 zachodzi kolejna różnica. Po prostu zamień te ciągi na zmienne i gotowe.
źródło
Powiedz, że masz trzy struny
Aby usunąć przedrostek b z a
Aby usunąć przyrostek c z a
źródło
echo "$a" | sed "s!^$b!!g"
(Zamieniłem standardowy separator seda / for! Na wypadek, gdyby zmienne, z którymi mamy do czynienia, były ścieżkami. Ponadto możesz użyć tutaj ciągu zamiast echo:.sed ... <<< $a
)Inny przykład:
Wyjścia
Oryginalna odpowiedź tutaj
źródło