所以,基本上,我想在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);
Run Code Online (Sandbox Code Playgroud)
无论如何定义变量选项卡,拆分都会成功恢复部件.但是,当它实际打印时,手动定义选项卡(未注释的版本)会按预期打印它,并带有制表符.但是,通过命令行会导致它实际打印"\ t"(就像String实际上是"\\ t")一样.
我主要使用bash,并且会对任何特定于bash的想法感到高兴,但如果它还包括对正在发生的事情的一般解释会更高兴.为什么两个正则表达式都是相同的,而字符串文字是不同的?
bash调用程序:
ARGS="$X $Y $Z \t"
java -cp $CLASSPATH $MEM $PROGRAM $ARGS 2> "${PROGRAM##*.}-error.log" > "${PROGRAM##*.}-out.log"
Run Code Online (Sandbox Code Playgroud)
这里提供的答案实际上主要用于我的目的,是相当可读的,并且通常只在相当不寻常的事情上失败:"\\\ t",例如:https: //gist.github.com/uklimaschewski/6741769
您tab在代码中定义的 是单字符字符串(因为“\t”是转义序列)。从命令行您会得到一个两个字符的字符串,因为 bash 不将“\t”处理为制表符。
要从命令行传递它,您可以使用echo -e支持转义序列的命令,例如\t(或\n其他一些):
$ java Main "$(echo -en '\t')"
Run Code Online (Sandbox Code Playgroud)
如果您在命令行上传递'\t'or "\t",它会导致将一个反斜杠后跟的 at传递给您的命令:
$ echo -n '\t' | xxd
00000000: 5c74 \t
$ echo -n "\t" | xxd
00000000: 5c74 \t
Run Code Online (Sandbox Code Playgroud)
Ctrl-v您可以使用以下命令在命令行上键入选项卡Tab:
$ echo -n ' ' | xxd
00000000: 09 .
Run Code Online (Sandbox Code Playgroud)
(那个宽的空格是制表符,而不是很多空格)。
| 归档时间: |
|
| 查看次数: |
2495 次 |
| 最近记录: |