你不能這樣做,在standard sed(1),因爲作爲\u
或\U
沒有這樣的事那裏。事實上,在我所有的系統中(但只有一個)它失敗了 - 也是一樣,唉!我在Mac筆記本電腦和Mac桌面上都試過sed
版本,然後在我們的Solaris服務器和我們的OpenBSD服務器上嘗試了它。我也在單獨的AIX機器上嘗試過它,當然它在那裏不起作用。 :(
但是,你應該能夠做到這一點可移植性這種方式,那些我測試系統的工作原理:
% cat sample
VI.d5.5
VII.b2.1
VII.b2.2
VII.b2.3
VII.c1
% perl -wpe 's/([^.]+)\.(.)/$1.\u$2.$2/' /tmp/sample
VI.D.d5.5
VII.B.b2.1
VII.B.b2.2
VII.B.b2.3
VII.C.c1
不僅是更便攜,這是一個容易得多,也
這應該適用於過去20年裏發佈的任何Perl版本,包括perl4。但是,如果你生活在最前沿,所以至少安裝5.10,那麼你可以這樣做:
% perl -M5.10.0 -wpe 's/[^.]+\.\K(?=(.))/\u$1./' /tmp/sample
VI.D.d5.5
VII.B.b2.1
VII.B.b2.2
VII.B.b2.3
VII.C.c1
‑M5.10.0
只是爲了確保您確實擁有並加載了5.10功能集。
Unicode怎麼樣?
現在假設您的樣本數據,它有統一:
% cat /tmp/sample.utf8
Ⅵ.ð5.5
Ⅷ.ß2.3
Ⅺ.ç1
% uniquote /tmp/sample.utf8
\N{U+2165}.\N{U+F0}5.5
\N{U+2167}.\N{U+DF}2.3
\N{U+216A}.\N{U+E7}1
% uniquote -v /tmp/sample.utf8
\N{ROMAN NUMERAL SIX}.\N{LATIN SMALL LETTER ETH}5.5
\N{ROMAN NUMERAL EIGHT}.\N{LATIN SMALL LETTER SHARP S}2.3
\N{ROMAN NUMERAL ELEVEN}.\N{LATIN SMALL LETTER C WITH CEDILLA}1
我可以向你保證你不會找到一個版本的sed
,做對這些數據正確的事情。它會搞砸。我去了我們犧牲的Linux系統,雖然他們使用的ɢɴᴜsed
在你的示例數據上工作,但是它拒絕在我的着名的Unicode數據集中映射其中一個字符,即使我的語言環境都設置正確。但perl
版本仍然是正確的。
但是對於perl,只需添加‑CSD
命令行選項來告訴perl數據文件和std {in,out,err}全部使用UTF-8,然後運行相同的命令,您將看到真正的東西QᴜɪᴛᴇIɴᴛᴇʀᴇsᴛɪɴɢ:
% perl -CSD -wpe 's/([^.]+)\.(.)/$1.\u$2.$2/' /tmp/sample.utf8
Ⅵ.Ð.ð5.5
Ⅷ.Ss.ß2.3
Ⅺ.Ç.ç1
% perl -CSD -wpe 's/[^.]+\.\K(?=(.))/\u$1./' /tmp/sample.utf8
Ⅵ.Ð.ð5.5
Ⅷ.Ss.ß2.3
Ⅺ.Ç.ç1
% perl -CSD -wpe 's/[^.]+\.\K(?=(.))/\U$1./' /tmp/sample.utf8
Ⅵ.Ð.ð5.5
Ⅷ.SS.ß2.3
Ⅺ.Ç.ç1
正如你看到的,有titlecasing是\u
確實和uppercasing是\U
確實之間的差異。這是因爲小寫字母「ß」在titlecase中是「Ss」,而大寫字母是「SS」。奇怪而真實!無可否認,這類事情發生在希臘字母上的情況比我們使用的拉丁字母更多,但您仍然希望做到這一點。
這裏說的是all uniquote d,所以你可以看到剛纔我們談論它的代碼點:
% perl -CSD -wpe 's/[^.]+\.\K(?=(.))/\u$1./' /tmp/sample.utf8 | uniquote
\N{U+2165}.\N{U+D0}.\N{U+F0}5.5
\N{U+2167}.Ss.\N{U+DF}2.3
\N{U+216A}.\N{U+C7}.\N{U+E7}1
% perl -CSD -wpe 's/[^.]+\.\K(?=(.))/\u$1./' /tmp/sample.utf8 | uniquote -v
\N{ROMAN NUMERAL SIX}.\N{LATIN CAPITAL LETTER ETH}.\N{LATIN SMALL LETTER ETH}5.5
\N{ROMAN NUMERAL EIGHT}.Ss.\N{LATIN SMALL LETTER SHARP S}2.3
\N{ROMAN NUMERAL ELEVEN}.\N{LATIN CAPITAL LETTER C WITH CEDILLA}.\N{LATIN SMALL LETTER C WITH CEDILLA}1
是不是非常酷?
謝謝 - 我不知道'\ u'。 – 2011-04-26 17:04:52
@Michael:'\ u'和'\ U'是[sed'的非標準擴展](http://pubs.opengroup.org/onlinepubs/000095399/utilities/sed.html#tag_04_126_13_02),雖然它們是標準的在Perl中。嘗試在下面給出的數據集上運行'sed'版本。它行不通。 – tchrist 2011-04-26 17:35:46
@tchrist:我會同意這是一個非標準的擴展,但是OP說\ U是「正在工作」,但不是隻停留在一個字符上,這意味着他不知道\ E或\ u,但更多重要的是,暗示他確實已經爲它安裝了適當的擴展。因此,如果「便攜性」對他來說不是問題,那麼使用\ u或\ U就可以了。 – 2011-04-26 17:51:43