使用gsed发行大写重音词

时间:2019-07-20 11:49:52

标签: bash

我已经用gsed发布大写的单词:

gsed -e“ s / \ b(。)/ \ u \ 1 / g”

字符串是:

诗人阿杰耶夫

期望的输出是:

诗人阿杰耶夫(Adjéèf)

但是它变成了:

AdjéÈFThe Poet

请注意:这是一个艺术家的创意名称,就是这样,带有两种不同的口音...

2 个答案:

答案 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)