首页 > 解决方案 > sed,匹配2个模式(包括)之间的所有行,然后将第二个匹配放在顶部

问题描述

这是我需要做的:

输入:(Python)

## This is a function,
## its purpose is... yada yada yada
def function_name(x):
    return x + 1

输出:(降价)

## function_name
This is a function,
its purpose is... yada yada yada

到目前为止,我得到了:

sed -n '/## /,/def/ { /## \|def/ p }' TEST.py | cut -d' ' -f2- | sed 's/(.*)\(.*\)://'

产生:

This is a function,
its purpose is... yada yada yada
function_name

有2个条件:

1.- “##”和“def”之间不匹配任何这些模式的行应该被忽略。

例子:

输入:(Python)

## This is a function,
## its purpose is... yada yada yada
# This is a normal comment, nothing to see here! (ignored)
def function_name(x):
    return x + 1

输出:(降价)

## function_name
This is a function,
its purpose is... yada yada yada

2.- 第二种模式必须被概括,例如,而不是使用“def”,假设我想使用“类”。

输入:(Python)

## This is a class,
## its purpose is... yada yada yada
# This is a normal comment, nothing to see here! (ignored)
class class_name:
    __init__(self, x):
        self.x = x

输出:(降价)

## class_name
This is a class,
its purpose is... yada yada yada

标签: awksed

解决方案


在每个 Unix 机器上的任何 shell 中使用任何 awk(如果你的 awk 不支持 POSIX 字符类,则使用它)a-zA-Z0-9[:alnum:]

$ cat tst.awk
sub(/^## */,"") {
    cmts = cmts $0 ORS
    next
}

sub(/^[[:alnum:]_]+ */,"") {
    sub(/[^[:alnum:]_].*/,"")
    print "##", $0
    print cmts
    cmts = ""
}

$ awk -f tst.awk file
## function_name
This is a function,
its purpose is... yada yada yada

## function_name
This is a function,
its purpose is... yada yada yada

## class_name
This is a class,
its purpose is... yada yada yada

以上是在这个输入文件上运行的:

$ cat file
## This is a function,
## its purpose is... yada yada yada
def function_name(x):
    return x + 1

## This is a function,
## its purpose is... yada yada yada
# This is a normal comment, nothing to see here! (ignored)
def function_name(x):
    return x + 1

## This is a class,
## its purpose is... yada yada yada
# This is a normal comment, nothing to see here! (ignored)
class class_name:
    __init__(self, x):
        self.x = x

推荐阅读