Czy istnieje sposób, w jaki wielkie / małe litery powinny zawierać tylko jeden znak w jakimś ciągu?
Przykład wprowadzania:
syslog_apr_24_30
syslog_mar_01_17
Pożądane wyjście:
syslog_Apr_24_30
syslog_Mar_01_17
Uwaga: proszę wpisać wielkie litery na początku miesiąca.
Próbowałem, awk
ale nie jestem wystarczająco dobry, aby uruchomić.
sed 's/_./\U&/'
awk:
źródło
Awk
wersja z podciągami i nakładkąPrzykładowy przebieg:
źródło
Używanie
awk
:lub
Przykład
źródło
Oto podejście Perla:
-p
Powoduje każdą linię do drukowany po zastosowaniu skryptu podane przez-e
. Podstawienie zastępuje pierwsze wystąpienie,_
a znak po nim ze sobą ($&
niezależnie od tego, co zostało dopasowane) wielkimi literami (uc()
), Nae
końcu operatora podstawienia (s///e
) jest potrzebny do oceny wyrażeń.źródło
Kolejny
perl
:źródło
Pure Bash 4.x, używając wyrażenia regularnego, aby wybrać część, którą chcesz upcase, i
^^
operator upcase na tej części. Sczepianie z przodu iz tyłu (dopasowane przez. *) W celu odtworzenia całego łańcucha:Jeśli nie pamiętasz wszystkich reguł cytowania, możesz bezpiecznie cytować wszystko oprócz wyrażenia regularnego (co spowodowałoby
=~
dosłowne dopasowanie łańcucha).Operator
^
upcase-first działa tylko na początku zmiennej (lub elementu tablicy). I wydaje się, że nie ma żadnego rozszerzenia podłań, które daje to, co perl nazwałby lvalue (które można przypisać / zmodyfikować). Operatorzy up / down-first mogą przyjąć wzorzec, który jest dopasowywany dla poszczególnych znaków, ale to nie pomaga pominąćsyslog_
, ponieważ istnieją nazwy miesięcy zaczynające się od znaków w „syslog”.W każdym razie może to być szybsze niż
foo="$(echo "$foo" | sed 's/_./\U&/')"
(opublikowane jako komentarz do zaakceptowanej odpowiedzi przez Glenna Jackmana).Bash, sed lub awk będą WIELE razy szybsze niż perl. Jeśli zaczniesz znajdować wiele linijek perlowych przydatnych w skrypcie powłoki, powinieneś po prostu napisać całą rzecz w perlu.
źródło
Jeśli miesiąc zawsze następuje po pierwszym „_” (podkreślenie), użyj tego (jak pokazano w innych odpowiedziach):
Jeśli przed poprzednim miesiącem mogą występować inne podkreślenia, powyższe nie będzie działać.
Jeśli miesiąc zawsze zaczyna się od ósmej litery, użyj tego:
źródło