Awk 使用grep从文件中匹配python多行表达式字符串?

Awk 使用grep从文件中匹配python多行表达式字符串?,awk,sed,grep,find,Awk,Sed,Grep,Find,请注意,这不是python问题。我有多个目录(大约500个目录,称为模块),每个目录都包含一个\uuuu manifest\uuuu.py文件。此文件被视为模块的元数据。该文件如下所示: { 'name': 'Associations Management', 'version': '0.1', 'category': 'Marketing', 'depends': [ 'base_setup', 'membership',

请注意,这不是python问题。我有多个目录(大约500个目录,称为模块),每个目录都包含一个
\uuuu manifest\uuuu.py
文件。此文件被视为模块的元数据。该文件如下所示:

{
    'name': 'Associations Management',
    'version': '0.1',
    'category': 'Marketing',
    'depends': [
        'base_setup', 
        'membership',
        'event'
    ],
    'data': ['views/views.xml'],
    'demo': [],
    'installable': True,
    'auto_install': False,
}
'depends': ['base', 'web],
// or multi-line as
"depends": [
    'base',
    'web',
]
'depends': [
        'base_setup', 
        'membership',
        'event'
    ],
    'data': ['views/views.xml'],
我想匹配并提取(仅使用Linux shell)一个模式,该模式可以如下所示:

{
    'name': 'Associations Management',
    'version': '0.1',
    'category': 'Marketing',
    'depends': [
        'base_setup', 
        'membership',
        'event'
    ],
    'data': ['views/views.xml'],
    'demo': [],
    'installable': True,
    'auto_install': False,
}
'depends': ['base', 'web],
// or multi-line as
"depends": [
    'base',
    'web',
]
'depends': [
        'base_setup', 
        'membership',
        'event'
    ],
    'data': ['views/views.xml'],
我对使用Linux命令提取这些信息非常感兴趣,比如
grep
sed
awk
&我对使用python解释器评估每个文件不感兴趣。所以我使用了下面的Linux命令

find-iname uuu manifest uuuu.py | xargs-I{}grep-H-E“('.\')依赖('.\\')(.?\\n)*\]\s*,“{}”
但是我的正则表达式不提供多行选择。我还担心匹配更多不需要的行,如下所示:

{
    'name': 'Associations Management',
    'version': '0.1',
    'category': 'Marketing',
    'depends': [
        'base_setup', 
        'membership',
        'event'
    ],
    'data': ['views/views.xml'],
    'demo': [],
    'installable': True,
    'auto_install': False,
}
'depends': ['base', 'web],
// or multi-line as
"depends": [
    'base',
    'web',
]
'depends': [
        'base_setup', 
        'membership',
        'event'
    ],
    'data': ['views/views.xml'],

感谢
GNU grep

$grep-zoE“'depends'”:\s*\[^][]+]'ip.txt | tr'\0'\n
“视情况而定”:[
“基本设置”,
"会籍",,
“事件”
]
  • -z
    选项将导致
    grep
    使用ASCII NUL字符作为分隔符。因此,假设您的输入文件没有这个字符,实际上这意味着输入是作为单个字符串读取的
  • -o
    仅获取匹配部分
  • “'dependens':\s*\[[^][]+]”
    将匹配
    'dependens':
    后跟可选空格,后跟
    [
    字符,后跟一个或多个非
    []
    字符,后跟
    ]
    • 这意味着任何嵌套的
      []
      序列都不适合此解决方案
  • tr'\0'\n'
    将NUL字符转换为换行符,因为
    -z
    在输出中将NUL表示为分隔符

与:

$rg-oUN“'depends'”:\s*\[[^\]\[]\[]+]ip.txt
“视情况而定”:[
“基本设置”,
"会籍",,
“事件”
]
优点是它不依赖于NUL字符,并且不必一次读取整个输入
-U
是多行匹配选项,
-N
关闭行号前缀(默认情况下,对于终端输出,该选项处于启用状态)。此外,
gnugrep
rg
都支持递归搜索


如果要匹配的数据始终为整行,且
“依赖”:[
在一行中,则也可以使用
awk
。有关说明,请参阅

$awk'/\047dependens\047:[[:blank:]*\[/{f=1}f;/]/{f=0}'ip.txt
“视情况而定”:[
“基本设置”,
"会籍",,
“事件”
],