sed 将匹配的文本剪切并粘贴到文件开头

sed 将匹配的文本剪切并粘贴到文件开头

我的目录中有大量文本文件,并且想要将第一个注释部分剪切并粘贴到文件的开头(注释文本的长度和起点各不相同,在某些情况下可能不存在) ,但应位于前 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

相关内容