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

时间:2010-11-09 03:16:00

标签: sed uppercase lowercase

例如,我的s​​rc.tex是

SectionType * p = NULL;

我希望它改为

section_type * p = NULL;

我想要做的只是更改 SectionType ,但仍保持 NULL 不变,我使用 y / [AZ] / [az] ,但这会改变所有的界限。

我的sed不支持\ L,\ l,\ U和\ u函数,它的版本是3. *并且在FSF下分发,而不是GNU,可能是GNU适用于这个函数,但当时我可以不采用GNU,因为我在msys工作,没有GNU包。

有没有解决办法?

2 个答案:

答案 0 :(得分:1)

来自here

将CamelCase或camelCase转换为camel_case:

sed -e 's/\([A-Z][a-z]\)/_\l\1/g' -e 's/^_\([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;

答案 1 :(得分:1)

这应该无需安装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