Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sed-将输入套管更换为ALLCAPS\u Camel(斯科特\u假人)_Sed - Fatal编程技术网

sed-将输入套管更换为ALLCAPS\u Camel(斯科特\u假人)

sed-将输入套管更换为ALLCAPS\u Camel(斯科特\u假人),sed,Sed,我很难从用户那里获取输入,也很难将格式设置为适合我的脚本的标准化格式 我愿意接受用户给我的任何内容,然后在u之前大写所有内容,并且只接受u之后的第一个字母_ 即: 用户还可以给我输入: scott_dummy SCOTT_DUMMY 我希望sed按照我的脚本所需的方式对其进行格式化: SCOTT_Dummy 在POSIXsed中执行此操作的方法既复杂又难看;基本上,您必须分割出要规格化的零件,然后使用y/abc…xyz/abc…xyz进行大小写转换,然后将零件粘合在一起 一些sed版本有一个

我很难从用户那里获取输入,也很难将格式设置为适合我的脚本的标准化格式

我愿意接受用户给我的任何内容,然后在u之前大写所有内容,并且只接受u之后的第一个字母_

即:

用户还可以给我输入:

scott_dummy
SCOTT_DUMMY
我希望sed按照我的脚本所需的方式对其进行格式化:

SCOTT_Dummy

在POSIX
sed
中执行此操作的方法既复杂又难看;基本上,您必须分割出要规格化的零件,然后使用
y/abc…xyz/abc…xyz进行大小写转换,然后将零件粘合在一起

一些
sed
版本有一个来自Perl的非标准扩展(它是从
vi
中借来的),但是当然,您也可以使用Perl,它根本不是POSIX,但在实际操作中是合理的标准

perl -pe 's/([^_]+)_([^_])([^_]*)/\U\1\E_\u\2\L\3/'
这不会对一行中第二个下划线之后的文本或不包含下划线的文本执行任何操作

有关正则表达式部分的说明,请参见。
-p
选项使Perl的行为非常类似于
sed
s/../../
当然是相同的(尽管Perl还有许多其他有趣的添加和扩展)。

这可能适合您(GNU-sed):

将所有非
\
的字符后跟一个
\
字符,再后跟一个附加字符,替换为大写等效字符,然后将所有字符替换为小写等效字符

注意:如果字符串中不包含
\uuu
,则这不会改变任何内容。要使所有前导字符大写,而不考虑
,请使用:

sed -E 's/([^_]*_?.)(.*)/\U\1\L\2/' file
另一种方式:

LU=$(printf "%s" {a..z} / {A..Z}) UL=$(printf "%s" {A..Z} / {a..z})
sed '/_./{y/'$LU'/;s//&\n/;h;y/'$UL'/;H;g;s/\n.*\n//}' file
要模拟可选的
解决方案,请使用:

L=abcdefghijklmnopqrstuvwxyz U=ABCDEFGHIJKLMNOPQRSTUVWXYZ
sed 'y/'$L'/'$U'/;/_./{s//&\n/;h;y/'$U'/'$L'/;H;g;s/\n.*\n//}' file

sed
中,没有可移植的方法可以轻松做到这一点。您接受Perl或Awk的解决方案吗?或者您可以为目标指定platfor或
sed
版本吗?不管怎样,你试过什么?你应该表现出一些努力(如果只是告诉我们你在问之前已经搜索过谷歌的话),我可以用Linux能够执行的任何形式。Awk很好。很高兴它对你有用。正如您所看到的,在注释中发布代码的效果不太好,对于堆栈溢出表示感谢的首选方式是向上投票有用的答案。你也可以在这里接受其中一个答案,或者自己写一个并接受。另见
LU=$(printf "%s" {a..z} / {A..Z}) UL=$(printf "%s" {A..Z} / {a..z})
sed '/_./{y/'$LU'/;s//&\n/;h;y/'$UL'/;H;g;s/\n.*\n//}' file
L=abcdefghijklmnopqrstuvwxyz U=ABCDEFGHIJKLMNOPQRSTUVWXYZ
sed 'y/'$L'/'$U'/;/_./{s//&\n/;h;y/'$U'/'$L'/;H;g;s/\n.*\n//}' file