Find text in terminal

0 votes
asked Dec 5, 2012 by ytheaudin (140 points)
edited Mar 4, 2013

I did not find the method to search for text in the terminal ssh you have a solution

Thanks

2 Answers

0 votes
answered Dec 5, 2012 by Lukas Matyska (56,670 points)
edited Dec 5, 2012

There is no such a method, but you can simply do it yourself like this:

bool FindText(VirtualTerminal terminal, string text, out int row, out int column)
{
    TerminalScreen s = terminal.Screen;

    // get all lines of the screen
    string[] lines = s.GetRegionText(0, 0, s.Columns, s.Rows);

    // iterate through all lines to find the text
    for (int r = 0; r < lines.Length; r++)
    {
        // check whether the text is on the current line
        int c = lines[r].IndexOf(text);
        if (c >= 0)
        {
            row = r;
            column = c;
            return true;
        }
    }

    // the text not found
    row = 0;
    column = 0;
    return false;
}

It can be used like this:

int row, column;
string text = "login:";
if (FindText(terminal, text, out row, out column))
    Console.WriteLine("Text '{0}' found at: {1}x{2}.", text, column, row);
else
    Console.WriteLine("Text '{0}' not found.", text);

If you would like to search the text using a Regex or using case insensitive search, adjust the int c = lines[r].IndexOf(text) line appropriately.

0 votes
answered Mar 1, 2013 by Pavel Matyska (13,340 points)
edited Mar 1, 2013

Here is an alternative solution for the method Lukas posted, but this goes through the terminal history, not only the terminal current screen.

public bool FindText(string text, int startRow, int startColumn)
{
    // Get screen with history
    MemoryStream ms = new MemoryStream();
    terminal.Save(ms, TerminalCaptureFormat.Text, TerminalCaptureOptions.SaveHistory);
    string data = Encoding.UTF8.GetString(ms.GetBuffer(), 0, (int)ms.Length);

    // get lines
    string[] lines = data.Split('\n');

    // iterate through the lines
    for (int r = startRow; r < lines.Length - 1; r++)
    {
        int c;
        if (r == startRow)
            c = lines[r].IndexOf(text, startColumn);
        else
            c = lines[r].IndexOf(text);

        if (c >= 0)
        {
            int rowOffset = r - (lines.Length - 1 - terminal.Screen.Rows);
            terminal.SetSelection(c, rowOffset, c + text.Length - 1, rowOffset);

            terminal.Scroll(terminal.HistoryMaxLength);
            terminal.Scroll(-(r - 2));
            _textFindColumn = c + 1;
            _textFindRow = r;
            return true;
        }
    }
    _textFindColumn = 0;
    _textFindRow = 0;
    return false;
}
...