2017-03-31 114 views
0

通常,我希望能夠在命令行(bash)中獲取字符串,並將其轉換爲標識符。一般情況下是在一個文件名,分行名,或變量名的使用,我喜歡它:命令行 - 將任何字符串轉換爲標識符?

  • 沒有空格在它
  • 在它

因此,對於沒有特殊字符例如,我可以採取一個字符串,像這樣:

bug fix for #PROJECT1 item 52, null pointer

並將其轉換爲這樣的事情:

bug_fix_for_PROJECT1_item_52__null_pointer

我接受任何語言的解決方案,例如bash,node,perl,python等,但更喜歡在大多數linux/osx機器上默認安裝的語言。

+0

必須有一個dup。轉換爲下劃線的文件名?請先搜索。 –

+0

嘿...我做了搜索,但搜索時沒有找到任何東西。無論如何,這至少會成爲其他解決方案的一個鏈接,這些解決方案對於bash中的命令行使用非常有用! –

+0

:/我看到'堆棧轉換bash轉換爲文件名下劃線轉義'或其他有意義的組合的命中幾十個。我的投票結果如下:http://serverfault.com/questions/348482/how-to-remove-invalid-characters-from-filenames –

回答

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' 
+1

對「正好一個_」的很好的考慮......謝謝! –

2

你試過嗎?

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

bug_fix_for_PROJECT1_item_52_null_pointer 
3

你可以這樣東西喜歡E本:

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:].,])的意思是「任何不是字母數字字符,而不是句號,而不是逗號」。您可以使用正則表達式語法添加要避免替換的任何其他字符,但保留外括號是關鍵。