Awk Sed,匹配两个模式(包括)之间的所有行,然后将第二个匹配放在顶部

Awk Sed,匹配两个模式(包括)之间的所有行,然后将第二个匹配放在顶部,awk,sed,Awk,Sed,这就是我需要做的: 输入:(Python) 这是一个函数, ##它的目的是。。。雅达雅达雅达 def功能_名称(x): 返回x+1 输出:(降价) ##函数名 这是一个函数, 它的目的是。。。雅达雅达雅达 到目前为止,我得到了: sed-n'/##/,/def/{/#def/p}TEST.py | cut-d'-f2-| sed's/(.*)\(.*):/' 产生: 这是一个函数, 它的目的是。。。雅达雅达雅达 函数名 有两个条件: 1.-“##”和“def”之间的线与这些模式中的任何一

这就是我需要做的:

输入:(Python)

这是一个函数, ##它的目的是。。。雅达雅达雅达 def功能_名称(x): 返回x+1 输出:(降价)

##函数名
这是一个函数,
它的目的是。。。雅达雅达雅达
到目前为止,我得到了:

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

这是一个函数,
它的目的是。。。雅达雅达雅达
函数名
有两个条件:

1.-“##”和“def”之间的线与这些模式中的任何一种都不匹配,应忽略

例如:

输入:(Python)

这是一个函数, ##它的目的是。。。雅达雅达雅达 #这是一个正常的评论,没有看到这里!(忽略) def功能_名称(x): 返回x+1 输出:(降价)

##函数名
这是一个函数,
它的目的是。。。雅达雅达雅达
2.-第二种模式必须通用化,例如,不使用“def”,假设我想使用“class”

输入:(Python)

##这是一个类,
##它的目的是。。。雅达雅达雅达
#这是一个正常的评论,没有看到这里!(忽略)
类别名称:
__初始化(self,x):
self.x=x
输出:(降价)

##类名
这是一门课,
它的目的是。。。雅达雅达雅达

使用
awk

$awk'/^##/{comment=comment substr($0,4)“\n”}
/^def/{printf“##%s\n%s”,substr($0,5,index($0,”(“”-5),注释
comment=”“}”TEST.py
##函数名
这是一个函数,
它的目的是……耶,耶,耶,耶
将以
##
开头的所有行追加到变量,当它看到以
def
开头的行时,打印函数名和前面几行的变量,然后清空该变量以重新开始


GNU
sed
version使用保留空间存储注释行:

$sed-n-e'/^##/{s/^##/{H}'-e'/^def/{s/^def\([^(]*\)./##1/\G;s/\n\n/\n/\p;z;x}'TEST py
##函数名
这是一个函数,
它的目的是……耶,耶,耶,耶

使用
awk

$awk'/^##/{comment=comment substr($0,4)“\n”}
/^def/{printf“##%s\n%s”,substr($0,5,index($0,”(“”-5),注释
comment=”“}”TEST.py
##函数名
这是一个函数,
它的目的是……耶,耶,耶,耶
将以
##
开头的所有行追加到变量,当它看到以
def
开头的行时,打印函数名和前面几行的变量,然后清空该变量以重新开始


GNU
sed
version使用保留空间存储注释行:

$sed-n-e'/^##/{s/^##/{H}'-e'/^def/{s/^def\([^(]*\)./##1/\G;s/\n\n/\n/\p;z;x}'TEST py
##函数名
这是一个函数,
它的目的是……耶,耶,耶,耶
awk'
/##/ { 
gsub(“##*”,“”)
以前的[++行]=$0
}
/def/{
gsub(“def”和“def”)
gsub(“[(].*”,“”)
打印“##”$0
对于(x=1;x
awk'
/##/ { 
gsub(“##*”,“”)
以前的[++行]=$0
}
/def/{
gsub(“def”和“def”)
gsub(“[(].*”,“”)
打印“##”$0

对于(x=1;x在每个Unix框的任何shell中使用任何awk(如果您的awk不支持POSIX字符类,请使用
a-zA-Z0-9
而不是
[:alnum://code>):

以上操作已在此输入文件上运行:

$ 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

在每个Unix框的任何shell中使用任何awk(如果您的awk不支持POSIX字符类,请使用
a-zA-Z0-9
而不是
[:alnum:///code>):

以上操作已在此输入文件上运行:

$ 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
这可能适用于您(GNU-sed):

如果当前行没有开始
##
什么也不做

用当前行替换保留空间

接下一行

如果行的开头是
##
,则将其附加到保留空间并重复上述操作

如果下一行没有开始
def
class
重复上述步骤

否则,将函数/类名操纵到标记标题中,从保留空间中附加注释,从注释中删除

这可能适用于您(GNU-sed):

如果当前行没有开始
##
什么也不做

用当前行替换保留空间

接下一行

如果行的开头是
##
,则将其附加到保留空间并重复上述操作

如果下一行没有开始
def
class
重复上述步骤


否则,将函数/类名操纵到一个标记标题中,从保留空间中附加注释,从注释中删除
##
,然后打印。

这是一行,但如果您想要一行,则不需要在引用的参数中使用换行符。这样看起来更难看,并且在两行之间需要一个分号第二块中的两个语句。是的,我在实现它之后意识到,虽然我认为有两个小问题可以概括,但我想我必须把它们放在任何地方。好了,我编辑了答案,因为在使用sed保持空间(H)之前没有明确说明.我必须承认我不理解以G开头的代码;-但我会查阅GNU-sed文档以获得一些帮助。我肯定学到了一些东西。这是一行,但如果你想要一行,你不需要引用参数中的换行符。那样看起来更难看,而且两行之间需要一个分号第二部分的内容。是的,我意识到在实现它之后,虽然有两个小问题我认为可以推广,但我想我还是要把它们放在一边好吗
$ 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
sed -En '/^##/{h;:a;n;/^##/{H;ba}
        s/^(def|class)( \w*).*/##\2/;Ta;G;s/^## ?//2mgp}' file