Mam kod źródłowy rozłożony na kilka plików.
- Ma wzór,
abcdef
który muszę zastąpićpqrstuvxyz
. - Wzorem może być
Abcdef
(Zdanie), a następnie należy go zastąpićPqrstuvxyz
. - Wzorem może być
AbCdEf
(Przełącz wielkość liter), a następnie należy go zastąpićPqRsTuVxYz
.
Krótko mówiąc, muszę dopasować wzór wzorca źródłowego i zastosować odpowiedni wzorzec docelowy.
Jak mogę to osiągnąć za pomocą sed
lub innego narzędzia?
text-processing
sed
awk
użytkownik1263746
źródło
źródło
ABcDeF
?ABcDeF
->PQrStUvxyz
, to na pewnoAbCdEf
->PqRsTuvxyz
byłoby logicznie spójne. Jeśli sprawa ma zostać skopiowana z jednego ciągu na drugi, co powinno się stać, jeśli drugi ciąg zastępujący jest dłuższy.Odpowiedzi:
Przenośne rozwiązanie wykorzystujące
sed
:Z GNU sed jest to trochę łatwiejsze:
Używając
&&&
powyższego, ponownie wykorzystujemy wzór wielkości liter w ciągu do końca zamiany, więcABcdef
zmieniono by naPQrstuVWx
iAbCdEf
naPqRsTuVwX
. Zmień to, aby&
wpływać tylko na wielkość pierwszych 6 znaków.(Zauważ, że nie może zrobić, co chcesz lub mogą działać w nieskończoną pętlę jeśli wymiana może podlegać podstawienia (na przykład jeśli zastępując
foo
nafoo
lubbcd
zaabcd
)źródło
Przenośne rozwiązanie wykorzystujące
awk
:Przykładowe dane wejściowe:
Przykładowe dane wyjściowe:
Aktualizacja
Jak wskazano w komentarzach, powyższe zastąpi tylko pierwsze wystąpienie
find
w każdym wierszu. Aby zastąpić wszystkie wystąpienia:Przykładowe dane wejściowe:
Przykładowe dane wyjściowe:
źródło
Możesz użyć
perl
. Prosto z FAQ - cytowanie zperldoc perlfaq6
:Jak zastąpić LHS bez rozróżniania wielkości liter, jednocześnie zachowując skrzynkę z RHS?
Oto piękne rozwiązanie Perlish autorstwa Larry'ego Roslera. Wykorzystuje właściwości bitowej xor na ciągach ASCII.
A tutaj jest to podprogram, wzorowany na powyższym:
To drukuje:
Alternatywnie, aby zachować wielkość słowa zastępującego, jeśli jest ono dłuższe niż oryginał, możesz użyć tego kodu autorstwa Jeffa Pinyana:
Zmienia to zdanie na „jest to przypadek SUcCess”.
Aby pokazać, że programiści C mogą pisać C w dowolnym języku programowania, jeśli wolisz bardziej podobne do C rozwiązanie, poniższy skrypt sprawia, że podstawienie ma taką samą wielkość liter, litera po literze, jak oryginał. (Zdarza się również, że działa o około 240% wolniej niż w rozwiązaniu Perlish.) Jeśli podstawienie ma więcej znaków niż podstawiany ciąg, to do końca podstawienia używana jest wielkość ostatniego znaku.
źródło
Jeśli przycinasz zamień na
pqrstu
, spróbuj tego:Wejście:
Ouput:
Jeśli chcesz zastąpić
prstuvxyz
, może to być:Nie mogę znaleźć żadnej reguły do zmapowania
ABcDeF
->PQrStUvxyz
.źródło
Coś takiego zrobiłoby to, co opisałeś.
źródło