我的目录中有大量文本文件,并且想要将第一个注释部分剪切并粘贴到文件的开头(注释文本的长度和起点各不相同,在某些情况下可能不存在) ,但应位于前 50 行)。我正在考虑使用一些 bash 代码来处理所有文件,然后对每个文件名使用 sed 来剪切 ''' 和 ''' 之间包含的第一块注释文本,以将其移动到文件顶部。我正在努力解决我认为需要嵌套的 sed 命令,最初使用 sed 查找匹配的文本块,然后使用 sed 保留空间。乌班图23.04
原始样本:
from itertools import permutations
import time
'''
Here is some comment text
that should be at start of file
some more lines
'''
def somepythoncode(x):
return x+1
目标:
'''
Here is some comment text
that should be at start of file
some more lines
'''
from itertools import permutations
import time
def somepythoncode(x):
return x+1
答案1
和ed
:
printf '%s\n' "/^'''$/; // m 0" wq | ed -s file.py
/^'''$/;
会将光标移动到与给定表达式匹配的第一行。m 0
将把寻址的行移动到零行之后的行(即,将它们插入到顶部)。地址是//
,这意味着最近匹配的正则表达式 ,^'''$
将被重用。这将用作结尾命令的地址。这开始地址是隐式的.
(当前行)。wq
将更改写回文件。
您可以使用/^'''$/; //+1 m 0
另一行来扩展结束范围。
答案2
使用任何 awk:
$ cat whatever.py
from itertools import permutations
import time
'''
Here is some comment text
that should be at start of file
some more lines
'''
def somepythoncode(x):
return x+1
$ cat tst.sh
#!/usr/bin/env bash
for file; do
awk -v delim="'''" '
$0 == delim { dnr[++cnt] = NR }
{ rec[NR] = $0 }
END {
if ( 2 in dnr ) {
for ( i=dnr[1]; i<=dnr[2]; i++ ) {
print rec[i] > FILENAME
delete rec[i]
}
for ( i=1; i<=NR; i++ ) {
if ( i in rec ) {
print rec[i] > FILENAME
}
}
}
}
' "$file"
done
$ ./tst.sh whatever.py
$ cat whatever.py
'''
Here is some comment text
that should be at start of file
some more lines
'''
from itertools import permutations
import time
def somepythoncode(x):
return x+1
上面假设您的文件不是太大而无法容纳在内存中,即长度小于几百万行。
答案3
您可以使用以下命令提取评论块:
$ awk "/'''/{p=! p;print;next}p" infile
'''
Here is some comment text
that should be at start of file
some more lines
'''
然后你将剩下:
$ awk "/'''/{p=! p;next};p==0{print}" infile
from itertools import permutations
import time
def somepythoncode(x):
return x+1
将两者结合起来将得到最终结果:
$ (awk "/'''/{p=! p;print;next}p" infile; awk "/'''/{p=! p;next};p==0{print}" infile)
'''
Here is some comment text
that should be at start of file
some more lines
'''
from itertools import permutations
import time
def somepythoncode(x):
return x+1