diff --git a/core/src/main/java/com/taobao/arthas/core/shell/cli/impl/CliTokenImpl.java b/core/src/main/java/com/taobao/arthas/core/shell/cli/impl/CliTokenImpl.java index 6ade0a554..ca956e556 100644 --- a/core/src/main/java/com/taobao/arthas/core/shell/cli/impl/CliTokenImpl.java +++ b/core/src/main/java/com/taobao/arthas/core/shell/cli/impl/CliTokenImpl.java @@ -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 correctPipeChar(List tokens) { + List newTokens = new ArrayList(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 builder) { while (index < s.length()) { char c = s.charAt(index);