2016-10-31 3 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», для экземпляр: https://gist.github.com/uklimaschewski/6741769

+0

я не получаю ваш вопрос. Вы хотите, чтобы ваш Java-код вызывал другую программу и передает ей «реальные» вкладки? – GhostCat

+0

Возможно, вам следует опубликовать, как вы выполнили этот код java в bash – ymonad

+0

@bhaal, можете ли вы добавить образец вызова из используемой командной строки? – alainlompo

ответ

1

Если вы передаете '\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          . 

(Это широкое пространство является символ табуляции, а не много пробелов).

+0

Я попытался набирать литеральную вкладку, и java, похоже, не воспринимал ее как аргумент. Возможно, я не совсем уверен, что вы предлагаете – bhaall

3

tab, который вы определили в коде, является односимвольной строкой (так как «\ t» является escape sequence). Из командной строки вы получаете строку из двух символов, так как bash не обрабатывает символ «\ t» в качестве символа табуляции.

Чтобы передать, что из командной строки, вы можете использовать echo -e, который поддерживает управляющие последовательности, как \t (или \n и несколько других):

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

В Bash вы можете сделать это более элегантно с синтаксисом C-строки; 'java Main $" \ t "' – tripleee

+0

java, похоже, не отображает аргумент для ответа в ответ. Во втором случае java фиксирует аргумент bash как строковый литерал – bhaall

0

Чтобы перейти на вкладку в качестве аргумента Баш, вы можете сделать любое из следующих действий:

mycommand $'arg\tcontaining\ttabs'
Который работает, потому что $'' в Баш интерпретирует управляющие последовательности.

mycommand 'argCtrl-vВкладкаcontainingCtrl-vВкладкаtabs'
Который работает, потому что Ctrl-v вызывает следующий набранный символ будет вставлен в буквальном смысле, а не интерпретировать.

mycommand "$(printf 'arg\tcontaining\ttabs')"
Который работает в Баше и других оболочках, поскольку printf интерпретирует обратные косую черту символов в качестве первого аргумента.

+0

Я пробовал это, но java захватил его как строковый литерал и не разложил его правильно – bhaall

+0

Вы уверены, что используете 'bash', а не что-то вроде' dash' ? Работала ли версия 'printf' для вас? – Eric

0

Самый простой на сегодняшний день является:

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

это фактически передает это как строковый литерал и не расщепляется правильно – bhaall

+0

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

Смежные вопросы