GNU sed中\u和\U有什么区别?

3

我在sed中遇到了这两个命令\u\U(以及其他如\l\L)。我必须承认我是一个新手,对GNU sed几乎没有经验。 我尝试了以下两个命令,但得到了相同的结果:

# I have tested this on Ubuntu 20.04
echo "abc" | sed 's/./\u&/g' # output is: ABC
echo "abc" | sed 's/./\U&/g' # output is: ABC

两个命令的输出结果相同,那么它们之间有什么区别呢?

1
在替换操作的左侧将 . 更改为 .* 并查看差异。同时去掉 g 标志。 - potong
1个回答

5

在替换操作中,\u将下一个字符转换为大写字母,而\U将替换的其余部分转换为大写字母,或者直到出现\L\E为止。

如果您在echo abc | sed 's/.*/\u&/'中使用模式.*(而不是.),则您将获得Abc,请注意示例并不能展示它们之间的区别,因为您一次只替换一个字符。

这些命令在info sed和这里有文档:https://www.gnu.org/software/sed/manual/sed.html#The-_0022s_0022-Command


@OK-Validation 我没有给你的问题投反对票。它可能被投反对票是因为它更像是一个“这个程序如何工作?”的问题,而不是一个编程问题,应该在Super User上提问。尽管我个人认为,当涉及到shell编程时,这条界限不太清晰。 - dan
你是否接受这个答案完全取决于你。除了说 . 匹配单个字符,而 .* 将匹配每个字符之外,我不知道该如何更清楚地表达。如果你尝试 's/.*/\u&/',你会得到 Abc。还要注意,g 表示在行中重复替换模式的每个出现。也许 echo abc | sed 's/./\u&_/g' 会更具说明性,它打印出 A_B_C_ - dan
1
@OK-Validation 丹的回答非常清晰明了,我认为没有什么可以改进的了。 - Renaud Pacalet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接