#1151 fix pipe char '|' problem

pull/1157/head
gongdewei 5 years ago
parent 0476c61af9
commit d301d98e0d

@ -3,6 +3,7 @@ package com.taobao.arthas.core.shell.cli.impl;
import com.taobao.arthas.core.shell.cli.CliToken;
import io.termd.core.readline.LineStatus;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
@ -70,10 +71,53 @@ public class CliTokenImpl implements CliToken {
tokenize(s, 0, tokens);
tokens = correctPipeChar(tokens);
return tokens;
}
/**
* fix pipe char '|' problem: https://github.com/alibaba/arthas/issues/1151
* supported:
* 1) thread| grep xxx
* [thread|, grep] -> [thread, |, grep]
* 2) thread |grep xxx
* [thread, |grep] -> [thread, |, grep]
*
* unsupported:
* 3) thread|grep xxx
* 4) trace -E classA|classB methodA|methodB|grep classA
* @param tokens
* @return
*/
private static List<CliToken> correctPipeChar(List<CliToken> tokens) {
List<CliToken> newTokens = new ArrayList<CliToken>(tokens.size()+4);
for (CliToken token : tokens) {
String tokenValue = token.value();
if (tokenValue.length()>1 && tokenValue.endsWith("|")) {
//split last char '|'
tokenValue = tokenValue.substring(0, tokenValue.length()-1);
String rawValue = token.raw();
rawValue = rawValue.substring(0, rawValue.length()-1);
newTokens.add(new CliTokenImpl(token.isText(), rawValue, tokenValue));
//add '|' char
newTokens.add(new CliTokenImpl(true, "|", "|"));
} else if (tokenValue.length()>1 && tokenValue.startsWith("|")) {
//add '|' char
newTokens.add(new CliTokenImpl(true, "|", "|"));
//remove first char '|'
tokenValue = tokenValue.substring(1);
String rawValue = token.raw();
rawValue = rawValue.substring(1);
newTokens.add(new CliTokenImpl(token.isText(), rawValue, tokenValue));
} else {
newTokens.add(token);
}
}
return newTokens;
}
private static void tokenize(String s, int index, List<CliToken> builder) {
while (index < s.length()) {
char c = s.charAt(index);

Loading…
Cancel
Save