我已经用gsed发布大写的单词:
gsed -e“ s / \ b(。)/ \ u \ 1 / g”
字符串是:
期望的输出是:
但是它变成了:
请注意:这是一个艺术家的创意名称,就是这样,带有两种不同的口音...
答案 0 :(得分:1)
您可以尝试:
sed -e 's/\([^ ]*\)/\u\1/g'
它创造了诗人Adjéeemf
答案 1 :(得分:0)
\b
边界与两个字符之间的位置匹配,其中一个字符为非字母,另一个字符为字母。
哪些字符准确地算作字母取决于语言环境,还取决于文本表示形式。
单纯地使用C语言环境和一些旧的8位字符集,é和è都不应该算作字母。
正确使用Unicode,两者都应该。
我猜您有一个非Unicode语言环境,或者是一个不遵守该语言环境的sed
版本。基本上,您得到的是随机破坏,其中偶然暴露了基础的Unicode表示(显然,我想是分解了,以便重音字符表示为 e 后跟一个连音符号)通过不支持这种抽象的工具。
许多或多或少涉及的变通办法是可能的;但我建议您切换到更可能实际支持这些复杂的Unicode的工具。
perl -CSD -pe 's/\b(.)/\u$1/g'
以下简单的演示脚本(在线尝试:https://ideone.com/VvXaAt)说明了相同的字符串如何具有多个Unicode表示,但是我的Perl解决方案仍然可以处理所有这些(再次说明,您的语言环境设置正确无误)配置)。
#!/bin/bash
nfc () {
perl -CSD -e 'print "NFC: adj\x{00e9}\x{00e8}f the poet\n"'
}
nfd () {
perl -CSD -e 'print "NFD: adje\x{0301}e\x{0300}f the poet\n"'
}
pc () {
perl -CSD -pe 's/\b(.)/\u$1/g'
}
echo '** Input **'
nfc
nfd
echo '** Output **'
nfc | pc
nfd | pc
示例输出:
** Input **
NFC: adjéèf the poet
NFD: adjéèf the poet
** Output **
NFC: Adjéèf The Poet
NFD: Adjéèf The Poet
我邀请您尝试将pc
函数替换为例如sed
脚本并观察所有差异。并非每个sed
都会被破坏,但这并不是在不同平台上sed
表现相同的地方。
也许更多地了解了Unicode equivalence (Wikipedia)。