匹配文件中的字符后

时间:2019-02-26 05:37:19

标签: shell sed grep sh

我一直在寻找解决方法herehere,但是没有运气,我找到了一个与我讨论类似情况的话题,最终我决定在这里问一个问题,因为它没有为我面临的情况提供解决方案。

如何使用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

不幸的是,这些方法对我不起作用,我将不胜感激!谢谢!。

1 个答案:

答案 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