2012-04-04 20 views
7

Ho bisogno di cambiare la prima lettera di ogni riga di un file in maiuscolo, ad es.Modifica della prima lettera di ogni riga di un file in maiuscolo

the bear ate the fish. 
the river was too fast. 

diventerebbero:

The bear ate the fish. 
The river was too fast. 
  • Il documento contiene alcune lettere speciali: a, a, a, a, ǎ, a, b, c, d, e, e, e, è, ì, ē, f, g, h, i, i, í, ì, ǐ, ì, j, k, l, m, n, o, o, ó, ò, ǒ, ō, p, q, r, s, t, u, u, ú, ù, ǔ, ü, ǘ, ǜ, ǚ, ǖ, ū, v, w, x, ye z.
  • Le forme maiuscole di queste lettere sono: A, A, Á, À, Ǎ, À, B, C, D, E, E, É, È, Ě, Ē, F, G, H, I, I , Í, Ì, Ǐ, Ī, J, K, L, M, N, O, O, Ó, Ò, Ǒ, Ō, P, Q, R, S, T, U, U, Ú, Ù, Ǔ , Ü, Ǘ, Ǜ, Ǚ, Ǖ, Ū, V, W, X, Y e Z.

Come posso modificare la prima lettera di ogni riga del file in maiuscolo?

+1

Penso che quello che Ingegnere voleva dire era ciò che il linguaggio di programmazione. PHP, ecc. –

+0

BASH sarebbe preferibile. – Village

+0

La questione è aggiunto 'bash' ... –

risposta

11

Uso sed:

sed 's/^\(.\)/\U\1/' yourfile > convertedfile 

piccola spiegazione:

  • il ^ rappresenta l'inizio di una riga.
  • . qualsiasi carattere
  • \U converte in maiuscolo
  • \(... \) specifica una sezione a cui fa riferimento più avanti (come \1 in questo caso); le parentesi devono essere sfuggite qui.

fare non cercare di reindirizzare l'output allo stesso file con un solo comando (vale a dire > yourfile), come si perderanno i dati. Se si desidera sostituire nello stesso file, consultare la risposta di joelparkerhenderson.

2

Per cambiare il file in luogo:

sed -i -e 's/^\(.\)/\U\1/' file.txt 
+0

Funziona! Ma anche, perché ottengo anche l'errore (avviso ??): sed: impossibile leggere: nessun file o directory? – bikashg

+0

@bikashg hai ricevuto l'errore perché c'era un errore di battitura nella mia risposta-- scusa ... l'ho risolto ora. – joelparkerhenderson

5
pearl.311> cat file1 
linenumber11 
linenumber2 
linenumber1 
linenumber4 
linenumber6 
pearl.312> awk '{print toupper(substr($0,1,1))""substr($0,2)}' file1 
Linenumber11 
Linenumber2 
Linenumber1 
Linenumber4 
Linenumber6 
pearl.313> 
+0

Funziona alla grande su OSX. Grazie. – Sufian

+0

Questo è stato l'unico che ha lavorato per me su OSX –

1

Potete mettere i vostri caratteri speciali al posto di a-z e A-Z

function up { local c="$1" ; echo -e "$c" | tr '[a-z]' '[A-Z]' ; } 
while read line 
do 
    echo $(up ${line:0:1})${line:1} 
done 
5

Ci sono alcune risposte sed con s/^\(.\)/\U\1/.GNU sed ha anche una direttiva \u che cambia solo la lettera successiva in maiuscolo, in modo

sed 's/./\u&/' 

Anche se il primo carattere su una riga è uno spazio, non si vedrà una lettera maiuscola, in modo

sed 's/[[:alpha:]]/\u&/' 
+0

direi che questa è la risposta migliore. –

0

Pure bash:

while read x ; do echo "${x^*}" ; done <inputfile> outputfile 

test/demo (rimuovere il codice dopo 0.123.per l'uscita più completa):

for f in a, a, á, à, ǎ, ā, b, c, d, e, e, é, è, ě, ē, f, g, h, i, i, í, ì, ǐ, ī, \ 
     j, k, l, m, n, o, o, ó, ò, ǒ, ō, p, q, r, s, t, \ 
     u, u, ú, ù, ǔ, ü, ǘ, ǜ, ǚ, ǖ, ū, v, w, x, y, and z. 
do echo "$f foo bar." ; done | 
while read x ; do echo "${x^*}" ; done | head -15 | tail -6 

uscita:

E, foo bar. 
E, foo bar. 
É, foo bar. 
È, foo bar. 
Ě, foo bar. 
Ē, foo bar. 
Problemi correlati