sed - come scrivere in maiuscolo ogni terza parola?


9

Dato:

main_east_library
main_west_roof
main_north_roof
minor_south_roof

Come posso utilizzato sed(in particolare, non è awk, tre così via) per creare:

main_east_Library
main_west_Roof
main_north_Roof
minor_south_Roof

Qualcosa di simile a:

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

Anche se questo dà:

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

1
senza awk o tr la tua sed fallirà se la provi su un sistema legacy o semplicemente su un altro sistema. Alcune delle espressioni nelle risposte sono estensioni GNU!
Ikrabbe,

Risposte:


11

Con GNU sed:

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

Scriverebbe in maiuscolo la terza sequenza di lettere da ciascuna riga.

Per capitalizzare ogni terza sequenza di lettere in ogni riga:

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

Per capitalizzare ogni terza sequenza di lettere nell'intero input , con GNU awk:

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

O con perl:

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

Mentre la [[:alpha:]]classe di caratteri può essere un po 'casuale su alcuni sistemi (ad esempio su sistemi GNU, che include molti numeri con l'esclusione di quelli arabi (0123456789)), Perl \p{...}si basa sulle proprietà dei caratteri Unicode. Quindi quelli \p{alpha}includeranno lettere in tutti gli alfabeti e anche caratteri alfabetici non di lettere.

Non includerà la combinazione dei segni diacritici, ma ciò significa che parole come Stéphanesarebbero considerate come due parole separate.

Quindi potresti voler invece:

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

Anche se questo potrebbe finire, compresi troppi.

Inoltre, al contrario di GNU sed, Perl \utrasformerà correttamente parole come fiddle(dove è un carattere di legatura) in Fiddle(2 caratteri Fe i).


3

perl

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

Conta 2 sequenze di caratteri che terminano con il trattino basso, quindi mette in maiuscolo il carattere successivo.


2

Un altro GNU sed:

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

Ciò presuppone che la riga inizi sempre con una parola.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.