如何使用sed在大小写之间传输字符

如何使用sed在大小写之间传输字符,sed,uppercase,lowercase,Sed,Uppercase,Lowercase,例如,我的src.tex是 SectionType*p=NULL 我想把它改成 截面类型*p=NULL 我想做的只是更改SectionType,但保持NULL不变,我使用了y/[A-Z]/[A-Z],但这将更改所有行 upper=$(printf "%s" {A..Z}) lower=$(printf "%s" {a..z}) sed "s/ /\n/;h;s/[^\n]*\n//;x;s/\n.*//;y/$upper/$lower/;G;s/\n//" inputfile 我的sed不支持

例如,我的src.tex是

SectionType*p=NULL

我想把它改成

截面类型*p=NULL

我想做的只是更改SectionType,但保持NULL不变,我使用了y/[A-Z]/[A-Z],但这将更改所有行

upper=$(printf "%s" {A..Z})
lower=$(printf "%s" {a..z})
sed "s/ /\n/;h;s/[^\n]*\n//;x;s/\n.*//;y/$upper/$lower/;G;s/\n//" inputfile
我的sed不支持\L、\L、\U和\U函数,它的版本是3.*并且在FSF下分发,而不是GNU,可能GNU可以很好地使用这些函数,但当时我无法采用GNU,因为我在msys中工作,并且没有GNU包

有什么解决办法吗?

将CamelCase或CamelCase转换为CamelCase\u:

sed-e's/\([A-Z][A-Z]\)/\ul\1/g'-e's/^\u\([A-Z]\)/\1/g'file.txt

输入:

SectionType *p = NULL;
sectionType *p = NULL;
ABCSectionType *p = NULL;
输出:

section_type *p = NULL;
section_type *p = NULL;
ABC_section_type *p = NULL;

无需安装另一版本的
sed
,此功能即可正常工作。它仅在行的第一个字上更改大小写

upper=$(printf "%s" {A..Z})
lower=$(printf "%s" {a..z})
sed "s/ /\n/;h;s/[^\n]*\n//;x;s/\n.*//;y/$upper/$lower/;G;s/\n//" inputfile
我的
sed
版本不能执行
y/[A-Z]/[A-Z]/
,它需要明确包含每个字符,这就是我使用变量的原因。我创建它们的方式取决于只有一些shell(如Bash和ksh)具有的特性。如果您的
sed
支持,您可以执行简单的赋值或使用范围

如果您的
sed
版本非常挑剔,它可能需要
-e
而不是分号。在这种情况下,此版本应适用:

sed -e "s/ /\n/" -e "h" -e "s/[^\n]*\n//" -e "x" -e "s/\n.*//" -e "y/$upper/$lower/" -e "G" -e "s/\n//" inputfile

啊,我错过了没有GNU的部分。使用Ignacio的链接和我发布的sed,你会没事的。嗯。。。这似乎践踏了
NULL
。正在寻找解决方案。编辑:修正。在第一个表达式上添加了
[a-z]
,以使其在所有大写字母中忽略所有内容。我在MSYS中尝试了您的脚本,但仍然无法使用我的sed,因为您的脚本使用了\l转换第一个字符,而我的sed不支持该功能…我下载了一个GNU发行版的sed,将其命名为“gsed”,并将其放在MSYS/bin下,它与您的脚本配合得很好,我们可以使用-i覆盖要传输的文件,并在命令行下保存大量按键。:)无论如何,我们应该测试每个版本的sed,以使脚本在大部分时间运行。谢谢你的建议。:)不客气。我很高兴这对你有好处。当您在stackoverflow上找到问题的正确答案时,您应该将答案标记为已接受答案(单击答案旁边的复选框)。目前,我不知道sed的这些高级功能,仅通过3天的学习,我就获得了一些sed中使用的正则表达式和替换语法。。。但是你的代码看起来很棒,我真的在我的sed中测试了它,正如你说的,运行良好,而且。。。要想在没有ctrl+c/v的情况下键入这么多字符很困难:)