Awk 使用内置UNIX工具之一选择一系列文本

Awk 使用内置UNIX工具之一选择一系列文本,awk,sed,grep,Awk,Sed,Grep,我的目标文件是python模块,如下所示: def function_one(arg): """docstring""" code code code def function_two(arg): """docstring""" code code code 我试图实现的是使用awk、sed或grep获得

我的目标文件是python模块,如下所示:

def function_one(arg):
    """docstring"""

    code
    code
    code


def function_two(arg):
    """docstring"""

    code
    code
    code
我试图实现的是使用
awk
sed
grep
获得
函数的主体

我想要实现这一点的方法是在函数名和两个空行之间选择一个文本范围(因为每个函数定义都以两个空行结尾)

到目前为止,我想到的是一个
awk
命令,它从函数名中选择文本,直到第一个空行:
awk'/def function\u one/,/^$/'module.py

但是,这只会生成此文本,因为我的docstring和函数体之间有一个空行:

def function_one(arg):
    """docstring"""

我应该如何定义一个范围,从一个字符串开始,精确地以两行结尾?

如何-使用GNU awk:

gawk -v RS='\n\n\n' '/function_one/' myFile
使用awk和“def”作为记录分隔符:

awk -v RS="def" '/function_one/ { print "def "$0 }' module.py

如果您不介意尾随空行,您可以按如下操作,让
file.txt
content成为:

def function_one(arg):
    """docstring"""

    code
    code
    code


def function_two(arg):
    """docstring"""

    code
    code
    code
然后

输出:

def function_one(arg):
    """docstring"""

    code
    code
    code

说明:我使用prev存储整行的长度,若prev line length和当前line length为0,则停止处理。对于每一行,只需打印即可。

解析Python的最佳方法是使用Python本身。尤其要检查你的大脑;不需要awk的
$'…
bash ism,只要
RS='\n\n\n'
就足够了。如果将
/function\u one/
更改为
/^def\s+function\u one,您可以使它更加健壮\(/
顺便说一句。你应该提到需要GNU awk才能使用mult char RS。@PatRes我看你接受了这个解决方案。当函数_one包含类似
的注释时,这肯定是个问题
或者当函数_one之前有一个函数调用函数_one,或者……,匹配你想要匹配的文本总是很简单的很难不匹配您不想匹配的文本,
def function_one(arg):
    """docstring"""

    code
    code
    code


def function_two(arg):
    """docstring"""

    code
    code
    code
awk '{curr=length($0);if(prev==0 && curr==0)exit;prev=curr;print}' file.txt
def function_one(arg):
    """docstring"""

    code
    code
    code