Как я могу получить следующее слово после сопоставления символов в файле - PullRequest
0 голосов
/ 26 февраля 2019

Я искал решение здесь и здесь но не повезло, я нашел ветку, в которой обсуждается аналогичный случай с моим, и в конце концов я решил задать вопрос здесь,потому что это не дает решения для случая, с которым я сталкиваюсь.

Как я могу получить определенное слово в скриптах Python (значение параметров), используя скрипт bash?Например, у меня есть сценарий Python, который имеет следующий код:

from datetime import datetime, timedelta
from airflow import DAG
...


args = {
    ...
}

# A DAG for my_bigquery_pipeline -> this line should not be included in bash searching.
with DAG(dag_id='my_bigquery_pipeline', default_args=args,
         schedule_interval='00 21 * * *') as dag:

из приведенного выше сценария, я хочу получить слово my_bigquery_pipeline, строка которого не комментируется, прежде чем я здесь спрашиваю, я 'мы попробовали это следующим образом:

sed -n '/^.*dag_id\s\+\/\(\w\+\).*$/s//\1/p' bigquery_pipeline.py
// and
sed "s/dag_id//2g" bigquery_pipeline.py
// and
egrep -oP '(?<=dag_id=/)\w+' bigquery_pipeline.py

к сожалению, этот метод не работает для меня, любую помощь я буду признателен!спасибо!.

1 Ответ

0 голосов
/ 26 февраля 2019

egrep равно grep -E, поэтому оно будет конфликтовать с переключателем -P.
Если у вас есть GNU grep, вы можете сделать это:

grep -oP '(?<=dag_id=.)\w+' bigquery_pipeline.py

или более точно:

grep -oP '(?<=dag_id=\x27)\w+' bigquery_pipeline.py

Где 0x27 - это код ' ascii.
Вы также можете изменить внешние кавычки, например:

grep -oP "(?<=dag_id=')\w+" bigquery_pipeline.py

или более совместимые с вашим .py путь кода:

 grep -oP 'dag_id\s*=\s*[\x27\x22]\K\w+' bigquery_pipeline.py

, который также будет соответствовать dag_id = "my_bigquery_pipeline", и даст результат my_bigquery_pipeline.

И sed решение:

sed -n '/^.*dag_id *= *[[:punct:]]\([[:alnum:]_]*\).*/s//\1/p' bigquery_pipeline.py
my_bigquery_pipeline

Чтобы избежать закомментированных строк:

grep -oP '^\s*[^#]+.*dag_id\s*=\s*[\x27\x22]\K\w+' bigquery_pipeline.py

или

sed -n '/^[^#]*dag_id *= *[[:punct:]]\([[:alnum:]_]*\).*/s//\1/p' bigquery_pipeline.py

и perl решение для необязательного dag_id=, а также игнорируйте закомментированные строки:

perl -nle 'print $& while m{[^#]*with DAG\((dag\s*=\s*)?[\x27\x22]\K\w+}g' bigquery_pipeline.py
...