在Java

时间:2016-10-31 08:01:12

标签: java bash

所以,基本上,我想在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”(就像String实际上是“\\ t”)一样。

我主要使用bash,并且会对任何特定于bash的想法感到高兴,但如果它还包括对正在发生的事情的一般解释会更高兴。为什么两个正则表达式都是相同的,而字符串文字是不同的?

bash调用程序:

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

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

这里提供的答案实际上主要用于我的目的,具有相当的可读性,并且通常仅在相当不寻常的事情上失败:“\\\ t”,例如:https://gist.github.com/uklimaschewski/6741769

4 个答案:

答案 0 :(得分:3)

您在代码中定义的tab是单字符字符串(因为" \ t"是escape sequence)。 从命令行,你得到一个两个字符的字符串,因为bash没有处理" \ t"作为标签字符。

要从命令行传递,您可以使用支持转义序列的echo -e,例如\t(或\n以及其他几个):

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

答案 1 :(得分:2)

如果在命令行上传递'\t'"\t",则会导致文字反斜杠后跟t传递给您的命令:

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

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

您可以使用 Ctrl-v 然后 Tab 在命令行上键入选项卡:

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

(宽广的空格是一个制表符,而不是很多空格。)

答案 2 :(得分:1)

要从bash传递选项卡作为参数,您可以执行以下任何操作:

mycommand $'arg\tcontaining\ttabs'
这是有效的,因为bash中的$''解释了转义序列。

mycommand 'arg CTRL-V 标签 containing CTRL-V 标签 { {1}}
这是有效的,因为 ctrl-v 导致输入的下一个字符按字面插入而不是被解释。

tabs'
哪个在bash和其他shell中有效,因为mycommand "$(printf 'arg\tcontaining\ttabs')"在第一个参数中解释反斜杠转义的字符。

答案 3 :(得分:0)

迄今为止最简单的是:

java my.package.Main $'\t'