sed - her 3 kelimeden bir tanesi nasıl aktifleştirilir?


9

Verilen:

main_east_library
main_west_roof
main_north_roof
minor_south_roof

Kullanmış nasıl sed(özellikle, değil awk, trvs.) oluşturmak için:

main_east_Library
main_west_Roof
main_north_Roof
minor_south_Roof

Gibi bir şey:

$ echo "main_west_library
main_west_roof
main_north_roof
minor_south_roof" | sed 's_\3_upcase(\3)_' 

Buna rağmen:

sed: -e expression #1, char 16: Invalid back reference

1
awk veya tr olmadan, eski veya başka bir sistemde denerseniz sediniz başarısız olur. Cevaplardaki bazı ifadeler GNU uzantılarıdır!
ikrabbe

Yanıtlar:


11

GNU ile sed:

sed -E 's/[[:alpha:]]+/\u&/3'

Her satırdaki üçüncü harf dizisini büyük harfle yazacaktır.

Yararlanmak için , her her hat harflerinin üçüncü dizisi:

sed -E 's/(([[:alpha:]]+[^[:alpha:]]+){2})([[:alpha:]]+)/\1\u\3/g'

GNU ile tüm girdideki her üç harf dizisini büyük harf yapmak içinawk :

awk -v RS='[^[:alpha:]]+' -v ORS= '
   NR % 3 == 0 {$0=toupper(substr($0,1,1)) substr($0,2)}
   {print $0 RT}'

Veya perl:

perl -Mopen=locale -pe 's/\p{alpha}+/++$n % 3 == 0 ? "\u$&" : "$&"/ge'

İken [[:alpha:]]karakter sınıfı bazı sistemlerde biraz rastgele olabilir (GNU sistemlerinde örneğin o Arapça olanlar (0123456789) hariç tutulması ile birçok rakamları içerir), Perl en \p{...}Unicode karakter özelliklerine dayanır. Böylece \p{alpha}tüm alfabe harfleri ve harf olmayan alfabetik karakterler içerecektir.

Aksanları birleştirmeyi içermeyecektir, ancak bu, benzer Stéphanekelimelerin iki ayrı kelime olarak kabul edileceği anlamına gelir .

Bunun yerine aşağıdakileri isteyebilirsiniz:

perl -Mopen=locale -pe 's/[\p{alpha}\p{mark}]+/++$n % 3 == 0 ? "\u$&" : "$&"/ge'

Yine de çok fazla dahil olabilir.

Ayrıca GNU'nun aksine sed, Perl'lerin ( bir bitişik karakterin olduğu yer) \ugibi kelimeleri (2 karakter ve ) olarak doğru şekilde dönüştüreceğini unutmayın .fiddleFiddleFi


3

perl

perl -pe 's/(?:.*?_){2}\K./\u$&/'

Alt çizgi ile biten 2 karakter dizisini sayar, ardından bir sonraki karakteri üstlenir.


2

Başka bir GNU sed:

sed -E 's/([^[:alpha:]])([[:alpha:]])/\1\u\2/2'

Bu, satırın her zaman bir sözcükle başladığını varsayar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.