Unix 转义字符串并使其准备就绪
我希望获取一个可能包含多个空格的字符串,并执行以下操作: 1) 用下划线替换空白 2) 删除所有非A-Z或0-9的字符 3) 将结果全部小写 然后能够将结果用作变量。有什么想法吗?我想我可以做你想做的事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:]-删除
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]/&/”。