Awk Sed,匹配两个模式(包括)之间的所有行,然后将第二个匹配放在顶部
这就是我需要做的: 输入:(Python) 这是一个函数, ##它的目的是。。。雅达雅达雅达 def功能_名称(x): 返回x+1 输出:(降价)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”之间的线与这些模式中的任何一
##函数名
这是一个函数,
它的目的是。。。雅达雅达雅达
到目前为止,我得到了:
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
开头的行时,打印函数名和前面几行的变量,然后清空该变量以重新开始
GNUsed
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
开头的行时,打印函数名和前面几行的变量,然后清空该变量以重新开始
GNUsed
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;xawk'
/##/ {
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