Dany:
main_east_library
main_west_roof
main_north_roof
minor_south_roof
W jaki sposób można stosować sed
(w szczególności, nie awk
, tr
itp), aby utworzyć:
main_east_Library
main_west_Roof
main_north_Roof
minor_south_Roof
Coś jak:
$ echo "main_west_library
main_west_roof
main_north_roof
minor_south_roof" | sed 's_\3_upcase(\3)_'
Chociaż daje to:
sed: -e expression #1, char 16: Invalid back reference
Odpowiedzi:
Z GNU
sed
:Dodałaby trzecią sekwencję liter z każdej linii.
Aby wykorzystać każdą trzecią sekwencję liter w każdym wierszu:
Aby używać wielkich liter co trzeci ciąg liter w całym danych wejściowych , w GNU
awk
:Lub z
perl
:Podczas gdy
[[:alpha:]]
klasa znaków może być nieco losowa w niektórych systemach (na przykład w systemach GNU, które zawierają wiele cyfr z wyłączeniem arabskich (0123456789)), Perl\p{...}
opiera się na właściwościach znaków Unicode.\p{alpha}
Będą więc zawierać litery wszystkich alfabetów, a także nieliterowe znaki alfabetu.Nie będzie jednak obejmował łączenia znaków diakrytycznych, co oznacza, że podobne słowa
Stéphane
będą uważane za dwa osobne słowa.Zamiast tego możesz chcieć:
Chociaż może to skończyć, w tym zbyt wielu.
Zauważ też, że w przeciwieństwie do GNU
sed
, Perl\u
poprawnie przekształci słowa takie jakfiddle
(gdziefi
jest jeden znak ligatury) naFiddle
(2 znakiF
ii
).źródło
perl
Liczy 2 sekwencje znaków kończących się znakiem podkreślenia, a następnie wielkie litery następnego znaku.
źródło
Kolejny GNU
sed
:Zakłada się, że linia zawsze zaczyna się od słowa.
źródło