命令行 - 将任何字符串转换为标识符?

时间:2017-03-31 18:44:10

标签: bash

我经常希望能够在命令行(bash)处获取字符串,并将其转换为标识符。通常这用于文件名,分支名称或变量名称,我更喜欢它:

  • 中没有空格
  • 中没有特殊字符

例如,我可以像这样使用字符串:

bug fix for #PROJECT1 item 52, null pointer

并将其转换为以下内容:

bug_fix_for_PROJECT1_item_52__null_pointer

我愿意接受任何语言的解决方案,例如: bash,node,perl,python等,但更喜欢在大多数linux / osx机器上默认安装的语言。

3 个答案:

答案 0 :(得分:3)

你可以这样:

original="bug fix for #PROJECT1 item 52, null pointer"
sanitized=${original//[^[:alnum:]]/_}
echo "$sanitized"

让我打破一下:

  • ${VAR_NAME//SEARCH/REPLACE}搜索并替换所有SEARCH次出现并执行替换。

  • [^[:alnum:]]表示任何非字母或数字的字符。 “NOT”部分是^

  • 外部括号表示表达式是指在括号内列出的不同可能性中选择的一个字符(有关如何使用此功能,请参阅下文)。

如果需要,可以根据需要做一些更微妙的事情。请记住,类UNIX系统几乎接受文件名中的任何字符(甚至是换行符),因此您不限于字母和数字。

例如,假设您要在文件名中保留句点和逗号。您可以更改替换语句:

sanitized=${original//[^[:alnum:].,]/_}

修改后的部分([^[:alnum:].,])表示“任何不是字母数字的字符,而不是句点,而不是逗号”。您可以使用正则表达式语法添加要避免替换的任何其他字符,但保留外括号是关键。

答案 1 :(得分:2)

你试过tr吗?

echo 'bug fix for #PROJECT1 item 52, null pointer' |  tr -d [:punct:] | tr '[:blank:]' '_'

bug_fix_for_PROJECT1_item_52_null_pointer

答案 2 :(得分:1)

只是perl命令行替换的替代变体,在单词和之间只有一个_具有连续的字符,如__

perl -ple 's/[^\w]/_/g;' -pe 's/__/_/g' <<<"bug fix for #PROJECT1 item 52, null pointer"
bug_fix_for_PROJECT1_item_52_null_pointer

python中的简单摘录

>>> import re
>>> re.sub('[^0-9a-zA-Z]+','_','bug fix for #PROJECT1 item 52, null pointer')
'bug_fix_for_PROJECT1_item_52_null_pointer'