在模式之间的sed中匹配之前打印一行

时间:2018-07-26 10:35:33

标签: regex sed

我在文本文件中有以下代码:

def test_one():
'''
Test case steps:
step1: STEP1
step2: STEP2
'''
x = "this"
assert 'h' in x

def test_two():
    '''
    Test case steps:
    step3: STEP3
    step4: STEP4
    '''
    x = "this"
    assert 'h' in x

我需要使用测试用例名称获取步骤,使用sed来获取模式

sed -n -e "/'''/,/'''/p" test_create_doc.py

使用sed之后:

'''
Test case steps:
step1: STEP1
step2: STEP2
'''
'''
Test case steps:
step3: STEP3
step4: STEP4
'''

需要比赛前一行,预期输出如下: 我需要在匹配模式前排一行。

test_one
'''
Test case steps:
step1: STEP1
step2: STEP2
'''
test_two
'''
Test case steps:
step3: STEP3
step4: STEP4
'''

请让我知道如何在模式匹配之前取一行。

2 个答案:

答案 0 :(得分:0)

这是一个快速修复方法,您可以在sed中匹配多个模式

sed -n -e "/def/,//p" -e "/'''/,/'''/p" test_create_doc.py

示例输出

def test_one():
    '''
    '''
    Test case steps:
    step1: STEP1
    step2: STEP2
    '''
def test_two():
    '''
    '''
    Test case steps:
    step3: STEP3
    step4: STEP4
    '''

PS:可能会有更好的方法来实现您在此处尝试的目标。 也许看看pydocs以及如何生成它们

答案 1 :(得分:0)

这在Awk中简单易懂。

awk "/'''/,/'''/ { if(p) { print p; p='' } print }
    { p = $2; sub(/\\(.*/, '', p) }" file

Awk脚本通常在单引号内,但是在这种情况下,双引号很方便,并且只需要将一个双反斜杠加倍(在双引号内,shell会弄乱美元符号,反斜杠和反斜杠)如果您需要在单引号内的Awk字符串中放置一个单引号,请使用八进制转义\047)。

我确信这在sed中是可能的;但我不想记录和维护该脚本。