Unix 转义字符串并使其准备就绪

Unix 转义字符串并使其准备就绪,unix,shell,batch-file,Unix,Shell,Batch File,我希望获取一个可能包含多个空格的字符串,并执行以下操作: 1) 用下划线替换空白 2) 删除所有非A-Z或0-9的字符 3) 将结果全部小写 然后能够将结果用作变量。有什么想法吗?我想我可以做你想做的事 variable=$(echo“${input}”| tr A-Z A-Z | tr[:blank:][u124; tr-cd[:alnum:][/code> 说明: tr A-Z A-Z-将大写字母翻译成小写字母 tr[:blank:][-将空格转换为下划线 tr-cd[:alnum:]-删除

我希望获取一个可能包含多个空格的字符串,并执行以下操作:

1) 用下划线替换空白

2) 删除所有非A-Z或0-9的字符

3) 将结果全部小写

然后能够将结果用作变量。有什么想法吗?

我想我可以做你想做的事

variable=$(echo“${input}”| tr A-Z A-Z | tr[:blank:][u124; tr-cd[:alnum:][/code>

说明:

tr A-Z A-Z
-将大写字母翻译成小写字母

tr[:blank:][
-将空格转换为下划线

tr-cd[:alnum:]
-删除所有非字母数字或下划线的字符

注意:如果您想在将空格转换为下划线之前删除下划线,可以在管道链的开头附近添加
tr-cd

我想您可以随心所欲

variable=$(echo“${input}”| tr A-Z A-Z | tr[:blank:][u124; tr-cd[:alnum:][/code>

说明:

tr A-Z A-Z
-将大写字母翻译成小写字母

tr[:blank:][
-将空格转换为下划线

tr-cd[:alnum:]
-删除所有非字母数字或下划线的字符


注意:如果要在将空格转换为下划线之前删除下划线,可以在管道链的开头附近添加
tr-cd

下面是使用sed的另一种方法:

oldvar="HELLO MY BABY @$#@$ HI"

newvar=`echo $oldvar | sed -e "s/[A-Z]/\l&/g" -e "s/[^a-z0-9]/_/g"`
结果:

hello_my_baby__0___hi

下面是使用sed的另一种方法:

oldvar="HELLO MY BABY @$#@$ HI"

newvar=`echo $oldvar | sed -e "s/[A-Z]/\l&/g" -e "s/[^a-z0-9]/_/g"`
结果:

hello_my_baby__0___hi

@口是心非:是的。好的(偶然的)测试用例,看看会发生什么。:-)我考虑过建议sed,但不确定如何匹配“空白”而不仅仅是空格。sed是否支持posix类?@Brandon:我不确定它是否支持posix类,但上面的最后一个reg exp将确保其他所有内容都转换为下划线。事实上,现在我想起来了,第一个匹配空格的字符根本不需要(删除)。是的,
sed
支持POSIX类。例如,您可以使用
[[:blank:][]
。因为$oldvar没有被引用,所以将生成路径名(尝试在值中包含“*”)。此外,echo实用程序可能会进行一些解释(“-n”或包含反斜杠的字符串易受攻击);要避免这种情况,请使用printf%s“$oldvar”。@duplicity:Yep。好的(偶然的)测试用例,看看会发生什么。:-)我考虑过建议sed,但不确定如何匹配“空白”而不仅仅是空格。sed是否支持posix类?@Brandon:我不确定它是否支持posix类,但上面的最后一个reg exp将确保其他所有内容都转换为下划线。事实上,现在我想起来了,第一个匹配空格的字符根本不需要(删除)。是的,
sed
支持POSIX类。例如,您可以使用
[[:blank:][]
。因为$oldvar没有被引用,所以将生成路径名(尝试在值中包含“*”)。此外,echo实用程序可能会进行一些解释(“-n”或包含反斜杠的字符串易受攻击);要避免这种情况,请使用printf%s“$oldvar”。什么是“unix就绪”呢?如果您指的是文件名,则允许使用“/”和“\0”以外的任何字符。当你使用它时,你只需要正确地引用它。你使用的是什么环境?您已经将批处理标记放在那里,它通常引用(Windows)批处理文件。不知怎的,我怀疑这里的情况是否如此。“unix就绪”是什么意思?如果您指的是文件名,则允许使用“/”和“\0”以外的任何字符。当你使用它时,你只需要正确地引用它。你使用的是什么环境?您已经将批处理标记放在那里,它通常引用(Windows)批处理文件。我怀疑这里的情况是否如此,Shell变量不能以数字开头;因此,在管道中添加“sed-e'1s/^[0-9]/&/”,Shell变量不能以数字开头;因此,在管道中添加“sed-e'1s/^[0-9]/&/”。