我正在寻找最好的(即与区域设置无关的)方法来大写或取消大写sed
.
我意识到这可以通过 来完成tr
。但我想将去大写作为更大的 sed 脚本的一部分,并且只对某些行执行此操作。
实际上,这个解决方案tr
似乎忽略了我机器上的重音字符!
<commands> | tr '[:lower:]' '[:upper:]'
我知道 y 命令sed
可用于将一组字符的出现替换为另一组字符。这可用于将字符串大写或取消大写。
然而,这将是一种幼稚的方法
<commands> | sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'
因为它不考虑重音字符。
当然,您可以只在两侧包含所有重音字符,但似乎应该有更好的方法。
我知道像 这样的等价类[=e=]
,在这种情况下将匹配“e”的所有变体。但看起来我不能将其与 y 命令一起使用 - 至少不是我想要的方式:
<commands> | sed 'y/[=a=]bcd[=e=]/[=A=]BCD[=E=]/'
sed 不会抱怨上述情况,但它也不起作用。
我也尝试过这个,结果相同(缺乏):
<commands> | sed 'y/[a-z]/[A-Z]/'
除了列出可能遇到的每个字符之外,还有什么方法可以做我想做的事情吗?
答案1
来自 GNUsed 文档,y命令要求源字符的长度与目标字符的长度完全匹配。左侧和右侧都不被视为正则表达式。
执行以下操作
echo 'forté' | sed 'y/[[:lower:]]/[[:upper:]]/'
给予
fprté
正如您所看到的,源字符被视为只是一堆字符,而不是正则表达式。
因此,列出您可能遇到的所有字符似乎是 y 命令的唯一选项。
但是如果您使用的是 GNU sed,还有另一种方法可以使用“s”命令!
echo 'forté' | sed 's/[[:lower:]]/\u&/g'
echo 'FORTÉ' | sed 's/[[:upper:]]/\l&/g'
[[:lower:]]
并[[:upper:]]
匹配任何/所有需要更改的字符。\u
并\l
做出改变。并g
确保该行中的每个事件都会发生这种情况。