0

次の形式のファイルがあります。

en Zyung 1 630
en zz%20top%20la%20grange%201st%20guitar%20solo 1 657
en Zz%20top%20la%20grange%20remastered 1 652
en.b %7Eobsidian 1 6937
en.b %C3%9Eie_Nummern/3 2 7521

「zyung」を意味する最初のスペースの後の 2 番目の文字列の最初の文字が小文字にならないようにしてください。私は持っています:

grep -i [a-z] filename

しかし、これは間違っている行の最初の文字に作用します。なにか提案を?

4

2 に答える 2

3

2 番目の単語が小文字で始まらない (実際には、小文字ではない文字で始まる) 行を出力するには、以下を使用します。

    env LANG=C LC_ALL=C awk '$2 ~ /^[^a-z]/' filename

または、その出力を別のファイルにリダイレクトするには

    env LANG=C LC_ALL=C awk '$2 ~ /^[^a-z]/' originalfile > newfile

各行の 2 番目の単語の最初の文字を大文字にするには、次を使用します。

    env LANG=C LC_ALL=C awk '{ $2 = toupper(substr($2,1,1)) substr($2,2) } 1' filename

または、別のファイルにリダイレクトするには、

    env LANG=C LC_ALL=C awk '{ $2 = toupper(substr($2,1,1)) substr($2,2) } 1' originalfile > newfile

originalfile==は使用しないでください。機能しnewfileないためです。シェルは> newfile、コマンドが開始される前に、最初にファイルをクリアします (出力がリダイレクトされるため)。空のファイルになってしまいます。

このenv LANG=C LC_ALL=C追加により、GNU awk と非 POSIX ロケールを使用している場合が回避されます。小文字だけでなく、あらゆる文字にgawk一致します。[a-z]ロケールを意識した動作がmawk必要な場合は、 の^[^[:lower:]]代わりにgawk 以外の awk を使用して^[^a-z]ください。

于 2013-09-07T23:24:36.640 に答える
2

このgrepを試してください:

grep -E '^\S*\s+[A-Z]' file

あなたの例でテストしてください:

kent$ echo "en Zyung 1 630
en zz%20top%20la%20grange%201st%20guitar%20solo 1 657
en Zz%20top%20la%20grange%20remastered 1 652"|grep -E '^\S*\s+[A-Z]'
en Zyung 1 630
en Zz%20top%20la%20grange%20remastered 1 652

ご覧のとおり、2行目は除外されています。

編集

この行を試してください:

grep -E '^\S*\s+[^a-z]' file
于 2013-09-07T23:13:19.550 に答える