Строки поиска Grep с разрывами строки

java.lang.VerifyError хуже.

Вы получили бы эту ошибку, если размер байт-кода Вашего метода превышает предел 64 КБ; но Вы, вероятно, заметили бы это.

Вы 100%, уверенных, что этот класс не присутствует в пути к классу в другом месте в Вашем приложении, возможно, в другой банке?

кроме того, от Вашего stacktrace, кодировка символов исходного файла (utf-8?), Который корректен?

9
задан Vijay Dev 7 December 2009 в 06:59
поделиться

4 ответа

Вы просто хотите найти файлы, содержащие шаблон, игнорируя разрывы строк, или вы действительно хотите увидеть совпадающие строки?

Если первое, вы можете использовать tr для преобразования новой строки в пробелы:

tr '\n' ' ' | grep 'export to excel'

В последнем случае вы можете сделать то же самое, но вы можете использовать флаг -o для вывода только фактического совпадения. Затем вы захотите изменить свое регулярное выражение, чтобы включить любой дополнительный контекст, который вы хотите.

6
ответ дан 4 December 2019 в 21:50
поделиться

Я немного проверил это, и, похоже, он работает:

sed -n '$b; /export to excel/{p; b}; N; /export to\nexcel/{p; b}; D' filename

Вы можете добавить дополнительные пробелы в конце и начале строк, например:

sed -n '$b; /export to excel/{p; b}; N; /export to\s*\n\s*excel/{p; b}; D' filename
0
ответ дан 4 December 2019 в 21:50
поделиться

используйте gawk. установите разделитель записей как excel, затем проверьте "экспорт в".

gawk -vRS="excel" '/export.*to/{print "found export to excel at record: "NR}' file

или

gawk '/export.*to.*excel/{print}
/export to/&&!/excel/{
  s=$0
  getline line
  if (line~/excel/){
   printf "%s\n%s\n",s,line
  } 
}' file
0
ответ дан 4 December 2019 в 21:50
поделиться

Я не знаю, как это сделать в grep. Я проверил страницу руководства для egrep (1) , и он также не может соответствовать новой строке в середине.

Мне нравится решение, предложенное @Laurence Gonsalves, с использованием tr (1 ) , чтобы стереть символы новой строки. Но, как он заметил, будет сложно напечатать совпадающие строки, если вы сделаете это таким образом.

Если вы хотите сопоставить, несмотря на новую строку, а затем распечатать совпадающие строки, я не могу придумать способ сделать это с помощью grep, но это было бы не слишком сложно в любом из Python, AWK, Perl или Ruby.

Вот сценарий Python, который решает проблему. Я решил, что для строк, которые соответствуют только при соединении с предыдущей строкой, я напечатаю стрелку -> перед второй строкой соответствия. Строки, которые полностью совпадают, всегда печатаются без стрелки.

Это написано в предположении, что / usr / bin / python - это Python 2.x. Вы можете тривиально изменить скрипт для работы под Python 3.x, если хотите.

#!/usr/bin/python

import re
import sys

s_pat = "export\s+to\s+excel"
pat = re.compile(s_pat)

def print_ete(fname):
    try:
        f = open(fname, "rt")
    except IOError:
        sys.stderr.write('print_ete: unable to open file "%s"\n' % fname)
        sys.exit(2)

    prev_line = ""
    i_last = -10
    for i, line in enumerate(f):
        # is ete within current line?
        if pat.search(line):
            print "%s:%d: %s" % (fname, i+1, line.strip())
            i_last = i
        else:
            # construct extended line that included previous
            # note newline is stripped
            s = prev_line.strip("\n") + " " + line
            # is ete within extended line?
            if pat.search(s):
                # matched ete in extended so want both lines printed
                # did we print prev line?
                if not i_last == (i - 1):
                    # no so print it now
                    print "%s:%d: %s" % (fname, i, prev_line.strip())
                # print cur line with special marker
                print "-->  %s:%d: %s" % (fname, i+1, line.strip())
                i_last = i
        # make sure we don't match ete twice
        prev_line = re.sub(pat, "", line)

try:
    if sys.argv[1] in ("-h", "--help"):
        raise IndexError # print help
except IndexError:
    sys.stderr.write("print_ete <filename>\n")
    sys.stderr.write('grep-like tool to print lines matching "%s"\n' %
            "export to excel")
    sys.exit(1)

print_ete(sys.argv[1])

EDIT: добавлены комментарии.

У меня возникли некоторые проблемы, чтобы заставить его печатать правильный номер строки в каждой строке, используя формат, аналогичный тому, что вы бы получили с помощью grep -Hn .

Это могло бы быть намного короче и проще, если бы вам не нужны были номера строк, и вы не возражаете, чтобы прочитать весь файл сразу в памяти:

#!/usr/bin/python

import re
import sys

# This pattern not compiled with re.MULTILINE on purpose.
# We *want* the \s pattern to match a newline here so it can
# match across multiple lines.
# Note the match group that gathers text around ete pattern uses a character
# class that matches anything but "\n", to grab text around ete.
s_pat = "([^\n]*export\s+to\s+excel[^\n]*)"
pat = re.compile(s_pat)

def print_ete(fname):
    try:
        text = open(fname, "rt").read()
    except IOError:
        sys.stderr.write('print_ete: unable to open file "%s"\n' % fname)
        sys.exit(2)

    for s_match in re.findall(pat, text):
        print s_match

try:
    if sys.argv[1] in ("-h", "--help"):
        raise IndexError # print help
except IndexError:
    sys.stderr.write("print_ete <filename>\n")
    sys.stderr.write('grep-like tool to print lines matching "%s"\n' %
            "export to excel")
    sys.exit(1)

print_ete(sys.argv[1])
2
ответ дан 4 December 2019 в 21:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: