sed和Mac OS X在使用to upper、to lower和整个捕获控制序列方面存在差异

12

我正在尝试从文件名中取出最后两个大写字母,并将它们附加到小写的文件名中。我预期使用的命令是:

ls | sed -e "s/.*\([A-Z][A-Z]\)$/\0\/\L\1\E/"

在我的Ubuntu系统上,我可以实现这一点并且工作得很好,但在我的Mac电脑上,它只是打印出一个0/LXXE/,其中XX是捕获的正确字母。

那么,在Mac上,有哪些与\0\L\E等价的sed命令?

我在网上查看了一些资料,发现有几个人注意到Mac OS X sed与Ubuntu sed不同,但大多数帖子都谈到-i需要文件扩展名或空字符串的要求(这曾经让我困扰过)。

2个回答

31

OSX(BSD)的sed不支持函数\L\E等。使用此选项在Mac上安装gnu sed

在Mac上安装gnu sed并使用它来代替BSD的sed解决这个问题。

brew install gnu-sed

9
使用命令 brew install --default-names gnu-sed 安装 gnu-sed,以便将其安装为 sed 而不是 gsed - TalkLittle
1
以 root 用户身份运行 Homebrew 是极其危险的,不再受支持。 - arekolek
OSX sed 不是旧版本,它是BSD版本。 - Daniel C. Sobral
谢谢@DanielC.Sobral,我会重新措辞我的回答。 - anubhava

5

awk的替代方案:

ls | awk '{print $0 tolower(substr($0,length($0)-1,2))}'

似乎不能按要求工作(至少在OS X上)-最后两个字符被重复。 - Paul R
2
@PaulR:据我所理解,这就是 OP 想要的:“*...取最后两个字母[...]并将它们附加...”。如果你想用它们的小写版本替换*最后两个字符,请尝试使用以下命令:ls | awk '{print substr($0,1,length($0)-2) tolower(substr($0,length($0)-1,2))}' - mschilli

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