2016-10-31 21 views
7

したがって、基本的には、javaなど、特殊文字(タブなど)を含む任意の文字列を正常に渡したいと思います。Javaのコマンドライン引数としてタブ文字を渡す

String tab = "\t"; 
//String tab = args[0]; 
String full = "hi"+tab+"hi"+tab+"bye"; 
String[] parts = full.split(tab); 
String print = ""; 
for (String s : parts) { 
    print += s + tab; 
} 
print = print.substring(0, print.length()-tab.length()); 
System.out.println(print); 

可変タブがどのように定義されているかにかかわらず、分割が正常に完了します。しかし、実際に印刷されると、手動でタブを定義する(コメントアウトされていないバージョン)タブ文字で期待どおりに印刷されます。しかし、コマンドラインを通過すると、実際には "\ t"(実際には文字列が "\\ t"の場合と同じです)が印刷されます。

私は主にbashを使用していますが、何が起こっているのかの一般的な説明も含まれていれば、もっとうれしいでしょう。なぜ文字列リテラルが異なるのですが、両方の正規表現は同じですか?

プログラムのbashの呼び出し:

ARGS="$X $Y $Z \t" 

java -cp $CLASSPATH $MEM $PROGRAM $ARGS 2> "${PROGRAM##*.}-error.log" > "${PROGRAM##*.}-out.log" 

ここで提供さ答えは実際にはほとんどが私の目的のために動作しない、唯一のかなり珍しいものを上の失敗、一般的にはかなり読みやすいです、そして:「\\\ tの」、のためにインスタンス:あなたは、コマンドラインで'\t'または"\t"を渡すとhttps://gist.github.com/uklimaschewski/6741769

+0

私はあなたの質問を得るいけません。あなたは、あなたのJavaコードが別のプログラムを呼び出し、それに "本当の"タブを渡すことを望みますか? – GhostCat

+0

このJavaコードをbashでどのように実行したのか投稿する必要があります – ymonad

+0

@bhaal使用しているコマンドラインからサンプル呼び出しを追加できますか? – alainlompo

答えて

1

、それはあなたのコマンドに渡されるt続くリテラルのバックスラッシュが発生します。

$ echo -n '\t' | xxd 
00000000: 5c74          \t 

$ echo -n "\t" | xxd 
00000000: 5c74          \t 

その後、タブCTRL-Vを使用して、コマンドラインでタブを入力することができます。

$ echo -n '  ' | xxd 
00000000: 09          . 

は(その広い空間は、タブ文字ではなく、スペースがたくさんあります)。

+0

リテラルタブを入力しようとしましたが、javaが引数としてキャプチャしていないようです。私はあなたが何を示唆しているのか完全にはっきりしていないかもしれません – bhaall

3

コードで定義したtabは、1文字の文字列です( "\ t"はescape sequenceなので)。 コマンドラインから、bashがタブ文字として "\ t"を処理しないので、2文字の文字列が得られます。

は、コマンドラインから、あなたが \t(または \nおよびいくつかの他)のようなエスケープシーケンスをサポートしてい echo -e使用できることを渡すには:

$ java Main "$(echo -en '\t')" 
+0

Bashでは、Cの文字列構文を使ってよりエレガントに行うことができます。 'java Main $" \ t "' – tripleee

+0

javaは答えの引数を取り込めていないようです。第二に、javaはbash引数を文字列リテラルとして取り込みます – bhaall

0

はbashのからの引数としてタブを渡すには、あなたが行うことができます次のいずれか:

bashの$''はエスケープシーケンスを解釈するため、動作します。

mycommand 'argCTRL-VタブcontainingCTRL-Vタイプされた次の文字を起こしCTRL-Vが解釈されるのではなく、文字通りに挿入するために動作タブtabs'
printfはその最初の引数にバックスラッシュでエスケープ文字を解釈するためには、bashなどのシェルでは、作品

mycommand "$(printf 'arg\tcontaining\ttabs')"
。はるかに

+0

私はそれを試みましたが、Javaはそれを文字列リテラルとして捕捉し、正しく分割しませんでした。 – bhaall

+0

'dash'のようなものではなく' bash' ? 'printf'版はあなたのために働いたのですか? – Eric

0

最も簡単なものは次のとおりです。

java my.package.Main $'\t' 
+0

これは実際にそれを文字列リテラルとして渡し、正しく分割しません。 – bhaall

+0

@bhaall '$ echo -n $ '\ t' | 「od-x」 「0000000 0009」 – alamar

関連する問題