2012-04-04 17 views
7

Potrzebuję zmienić pierwszą literę każdego wiersza w pliku na wielkie, np.Zmiana pierwszej litery każdej linii w pliku na wielką literę

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

staną:

The bear ate the fish. 
The river was too fast. 
  • Dokument zawiera kilka znaków specjalnych: 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, y i z.
  • Wielkimi literami tych liter są: 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 i Z.

Jak zmienić pierwszą literę każdego wiersza w pliku na wielkie?

+1

myślę co Engineer oznaczało właśnie językiem programowania. PHP, itp. –

+0

BASH byłby preferowany. – Village

+0

Pytanie jest oznaczone jako "bash" ... –

Odpowiedz

11

Zastosowanie sed:

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

Małe wyjaśnienie:

  • ^ stanowi początek linii.
  • . dopasowuje dowolny znak
  • \U zamienia na wielkie
  • \(... \) określa sekcję należy odwoływać później (jako \1 w tym przypadku); nawiasy są tutaj zbierane.

Czy nie próbować przekierować wyjście do tego samego pliku w jednym poleceniu (tj > yourfile) jak stracisz swoje dane. Jeśli chcesz zastąpić w tym samym pliku, sprawdź odpowiedź joelparkerhenderson.

2

Aby zmienić plik na swoim miejscu:

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

Działa! Ale także, dlaczego również dostaję błąd (ostrzeżenie ??): sed: nie można odczytać: nie ma takiego pliku lub katalogu? – bikashg

+0

@bikashg masz błąd, ponieważ w mojej odpowiedzi był literówka - przepraszam - naprawiłem to teraz. – 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

Działa świetnie na OSX. Dzięki. – Sufian

+0

To był jedyny, który pracował dla mnie na OSX –

1

można umieścić znaki specjalne zamiast-Z i 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

Istnieje kilka sed odpowiedzi z s/^\(.\)/\U\1/.GNU sed ma również dyrektywę \u który zmienia tylko następną literę na wielkie litery, tak

sed 's/./\u&/' 

Chociaż jeśli pierwszy znak na linii jest przestrzenią, nie będzie widać wielką literę, więc

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

Powiedziałbym, że to jest lepsza odpowiedź. –

0

Czysta bash:

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

test/demo (usunąć kod po done dla pełniejszego wyjściu):

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 

wyjściowa:

E, foo bar. 
E, foo bar. 
É, foo bar. 
È, foo bar. 
Ě, foo bar. 
Ē, foo bar. 
Powiązane problemy