java.lang.VerifyError
хуже.
Вы получили бы эту ошибку, если размер байт-кода Вашего метода превышает предел 64 КБ; но Вы, вероятно, заметили бы это.
Вы 100%, уверенных, что этот класс не присутствует в пути к классу в другом месте в Вашем приложении, возможно, в другой банке?
кроме того, от Вашего stacktrace, кодировка символов исходного файла (utf-8
?), Который корректен?
Вы просто хотите найти файлы, содержащие шаблон, игнорируя разрывы строк, или вы действительно хотите увидеть совпадающие строки?
Если первое, вы можете использовать tr
для преобразования новой строки в пробелы:
tr '\n' ' ' | grep 'export to excel'
В последнем случае вы можете сделать то же самое, но вы можете использовать флаг -o для вывода только фактического совпадения. Затем вы захотите изменить свое регулярное выражение, чтобы включить любой дополнительный контекст, который вы хотите.
Я немного проверил это, и, похоже, он работает:
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
используйте 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
Я не знаю, как это сделать в 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])