Как найти строку, начинающуюся с 'a' и заканчивая 'c', используя grep?

Мы не знаем наверняка, если ..

могут быть линии между парами или перед ними, которые не являются частью пары; заголовок? объяснение? комментарий? первая строка начинается с x по определению, вторая строка пары, возможно, начинается с x

. Чтобы поймать все эти ситуации, используя set(), мы можем искать линии, которые существуют только of (all) x, A, B. Эти, мы можем быть положительными, являются первыми линиями наших пар.

Таким образом, мы получаем в python:

#!/usr/bin/env python3

f = "/path/to/file"

printresult = False

for l in open(f):
    if printresult == True:
        print(l[i[0]:i[1]])
        printresult = False
    elif set(l.strip()) == {"A", "x", "B"}:
        i = [l.index("A"), l.index("B") + 1]
        printresult = True

Таким образом, вывод:

будет:

7890MNOP
34567890MNOPQRST
x234567890MNOPQR
1
задан 2 May 2018 в 08:46

3 ответа

Проблема с этой командой заключается в том, что когда я использую ^ ac $, команда интерпретирует ее как начинающуюся с 'ac' вместо того, чтобы начинать с 'a'.

Не совсем. Поскольку вы использовали якорь $, вы ищете строки, которые заканчиваются сразу после строки ac, поэтому сопоставляются только строки, содержащие ровно один ac и больше символов.

Чтобы разрешить любые символы между этими буквами, используйте регулярное выражение для любого количества любых символов: .* (или если вы хотите разрешить только один символ, как в abc в примере, используйте . без $ anchor как *.)

Кстати, вы можете просто оставить параметр -E для этого регулярного выражения, так как он не содержит никакого синтаксиса, который бы отличался в этих двух вариантах.

Итак, результат:

grep '^a.*c$' newfile
4
ответ дан 22 May 2018 в 11:03
Проблема с этой командой заключается в том, что когда я использую ^ ac $, команда интерпретирует ее как начинающуюся с 'ac' вместо того, чтобы начинать с 'a'.

Не совсем. Поскольку вы использовали якорь $, вы ищете строки, которые заканчиваются сразу после строки ac, поэтому сопоставляются только строки, содержащие ровно один ac и больше символов.

Чтобы разрешить любые символы между этими буквами, используйте регулярное выражение для любого количества любых символов: .* (или если вы хотите разрешить только один символ, как в abc в примере, используйте . без $ anchor как *.)

Кстати, вы можете просто оставить параметр -E для этого регулярного выражения, так как он не содержит никакого синтаксиса, который бы отличался в этих двух вариантах.

Итак, результат:

grep '^a.*c$' newfile
4
ответ дан 17 July 2018 в 15:30
Проблема с этой командой заключается в том, что когда я использую ^ ac $, команда интерпретирует ее как начинающуюся с 'ac' вместо того, чтобы начинать с 'a'.

Не совсем. Поскольку вы использовали якорь $, вы ищете строки, которые заканчиваются сразу после строки ac, поэтому сопоставляются только строки, содержащие ровно один ac и больше символов.

Чтобы разрешить любые символы между этими буквами, используйте регулярное выражение для любого количества любых символов: .* (или если вы хотите разрешить только один символ, как в abc в примере, используйте . без $ anchor как *.)

Кстати, вы можете просто оставить параметр -E для этого регулярного выражения, так как он не содержит никакого синтаксиса, который бы отличался в этих двух вариантах.

Итак, результат:

grep '^a.*c$' newfile
4
ответ дан 23 July 2018 в 16:26

Другие вопросы по тегам:

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