我一直在寻找解决方法here和here,但是没有运气,我找到了一个与我讨论类似情况的话题,最终我决定在这里问一个问题,因为它没有为我面临的情况提供解决方案。
如何使用bash脚本在Python脚本中获得某个单词(参数值)?例如,我有一个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
不幸的是,这些方法对我不起作用,我将不胜感激!谢谢!。
答案 0 :(得分:1)
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