使用 sed y 命令与区域设置无关的大写或取消大写

使用 sed y 命令与区域设置无关的大写或取消大写

我正在寻找最好的(即与区域设置无关的)方法来大写或取消大写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确保该行中的每个事件都会发生这种情况。

相关内容