Mam temp
plik z zawartością małych i dużych liter.
Wejście
Zawartość mojego temp
pliku:
hi
Jigar
GANDHI
jiga
Chcę przekonwertować wszystkie górne na dolne .
Komenda
Próbowałem następującego polecenia:
sed -e "s/[A-Z]/[a-z]/g" temp
ale otrzymałem zły wynik.
Wynik
Chcę to jako:
hi
jigar
gandhi
jiga
Co powinno znaleźć się w zastępczej części argumentu sed
?
Odpowiedzi:
Jeśli dane wejściowe zawierają tylko znaki ASCII, możesz użyć
tr
:lub (mniej łatwe do zapamiętania i wpisania IMO; ale nie tylko litery alfabetu łacińskiego ASCII, choć w niektórych implementacjach, w tym GNU
tr
, nadal ograniczone do znaków jednobajtowych, więc w ustawieniach regionalnych UTF-8 nadal ograniczone do liter ASCII):jeśli musisz użyć
sed
:(tutaj przy założeniu implementacji GNU).
W POSIX
sed
musisz określić wszystkie transliteracje, a następnie wybrać litery, które chcesz przekonwertować:Z
awk
:źródło
\L
jest to rozszerzenie GNU.\L
jak dotąd działa dobrze dla mnie. W świetle punktu, w którym próbujesz dokonać rozszerzenia GNUsed
jest poleceniem uniksowym. Różne systemy mają różne warianty o różnych zachowaniach i funkcjach. Na szczęście w dzisiejszych czasach istnieje standard, który jest najbardziej zgodny, więc możesz liczyć na minimalny zestaw funkcji wspólnych dla wszystkich.\L
nie ma go wśród nich i został wprowadzony przez GNUsed
(pasuje do tego samego operatora w standardzieex
/vi
) i ogólnie nie jest dostępny w innych implementacjach.tr
implementacje, takie jak GNUtr
, nie działają poprawnie w wielobajtowych lokalizacjach (większość z nich jest obecnie,echo STÉPHANE | tr '[:upper:]' '[:lower:]'
na przykład spróbuj ). W systemach GNU, może woliszsed
wariant alboawk
„stolower()
.sed 's/.*/\L&/g' < input
.\1
Odniesienie do dopasowanego podciągu nie będzie działać, jeśli podasz podciąg z nawiasie jako wurtle robi w jego. Jednak,&
jak pokazano , jest nieco czystszy w reprezentowaniu całego meczuKorzystanie z vima jest bardzo proste:
Otwiera plik,
gg
przechodzi do pierwszego wiersza0
, pierwszej kolumny. DziękiguG
obniża wielkość liter wszystkich znaków do końca pliku.ZZ
zapisuje i wychodzi.Powinien obsłużyć prawie wszystko, co w niego rzucisz; zignoruje liczby, obsłuży inne niż ASCII.
Jeśli chcesz zrobić odwrotnie, zamień małe litery na wielkie, zamień
u
naU
:gg0gUGZZ
i gotowe.źródło
vim file1 file2 fileetc
i wtedy coś:bufdo gg0guG:w<CR>
będzie prawdopodobnie pracować dla dowolnej liczby plików. Jednak tego nie testowałem!Sam to lubię
dd
.... dostaje ...
Ma
LC_ALL=C
to na celu ochronę wszelkich wielobajtowych danych wejściowych - chociaż żadne wielobajtowe stolice nie będą konwertowane. To samo dotyczy (GNU)tr
- obie aplikacje są podatne na wprowadzanie zniekształceń w dowolnym języku innym niż C.iconv
można połączyć z jednym z nich, aby uzyskać kompleksowe rozwiązanie.The
2>/dev/null
odrzutów przekierowaćdd
domyślny raport stanu „s - i jego stderr. Bez tegodd
nastąpiłoby zakończenie zadania takiego jak powyższe informacje o drukowaniu, takie jak liczba przetworzonych bajtów itp.źródło
tr
przypadku obsługi dużych plików, dzięki!Możesz także użyć Perla 5:
Opcja
-p
mówi Perlowi, aby uruchomił określone wyrażenie raz dla każdego wiersza wejścia, wypisując wynik, tj. Wartość końcową$_
.-e
wskazuje, że program będzie następnym argumentem, w przeciwieństwie do pliku zawierającego skrypt.lc
konwertuje na małe litery. Bez argumentu będzie działać dalej$_
. I$_=
zapisuje to ponownie, aby zostało wydrukowane.Byłaby to odmiana
Używanie
-n
jest jak-p
z wyjątkiem tego,$_
że nie zostanie wydrukowane na końcu. Zamiast zapisywać w tej zmiennej, dołączam wyraźną instrukcję drukowania.Jedną zaletą Perla w przeciwieństwie do sed jest to, że nie potrzebujesz żadnych rozszerzeń GNU. Istnieją projekty, które muszą być kompatybilne ze środowiskami innymi niż GNU, ale które mają już zależność Perla jako asa. W porównaniu z
tr
tym może być tak, że Perllc
może być łatwiej rozpoznany przez ustawienia regionalne. Szczegółowe informacje można znaleźć naperllocale
stronie podręcznika man.źródło
Musisz uchwycić pasujący wzór, a następnie użyć go w zamian za pomocą modyfikatora:
\(...\)
„Wychwytuje” zakrywające dopasowany tekst, pierwszy idzie do przechwytywania\1
, następny do\2
itp Numeracja odpowiada otwarciu nawiasów w przypadku zagnieżdżonych zrzuty.\L
Konwertuje przechwycone wzór na małe litery, istnieje również\U
na wielkie litery.źródło
&
Oprócz odpowiedzi MvG, możesz również użyć Perla 6:
perl6 -pe .=lc temp
Tutaj $ _ jest niejawne i nie potrzebujesz pojedynczych cudzysłowów, aby chronić go przed rozszerzeniem przez powłokę ($ _ jest specjalnym parametrem Bash; patrz: https://www.gnu.org/software/bash/manual/ html_node / Special-Parameters.html )
źródło