2017-03-31 19 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

ダブする必要があります。下線付きのファイル名に変換しますか?まず検索してください。 –

+0

ねえ...私は検索しましたが、検索するときに何も見つかりませんでした。それにもかかわらず、これは少なくとも、bashのコマンドラインの使用に適した他のソリューションへのリンクになります! –

+0

:/ 'stackoverflow 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

「正確に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 
3

あなたは何か好きかもしれませんE本:

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

ル私は少しそれを打破:

  • ${VAR_NAME//SEARCH/REPLACE}検索をしてSEARCHのすべての出現を置き換え、置き換えを実行します。

  • [^[:alnum:]]は、アルファベットまたは数字ではない任意の文字を意味します。 "NOT"部分は^

  • です。外側の括弧は、式がブラケット内にリストされている異なる可能性の中から選択された1文字を参照していることを示しています。

これは、必要に応じてもう少し微妙なことをするように調整できます。 UNIXのようなシステムでは、ファイル名(改行さえ)のほとんどすべての文字を受け入れることができるので、文字と数字に制限されません。

たとえば、ファイル名にピリオドとカンマを使用するとします。あなたは、交換用のステートメントを変更することができます:

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

修正部分([^[:alnum:].,])は「英数文字、およびない期間ではなく、コンマでないもの」を意味します。置き換えを避ける他の文字は、正規表現構文を使用して追加できますが、外側の角かっこを保持することが重要です。

関連する問題