sedは一致するテキストを切り取り、ファイルの先頭に貼り付けます。

sedは一致するテキストを切り取り、ファイルの先頭に貼り付けます。

ディレクトリに多数のテキストファイルがあり、最初のコメントセクションを切り取り、ファイルの先頭に貼り付けたいです(コメントテキストは長さと開始点が異なり、場合によっては存在しない場合があります)。最初の50行に位置)。私はbashコードを使用してすべてのファイルを処理し、各ファイル名にsedを使用して「」と「」の間に含まれるコメントテキストの最初のブロックを切り取り、ファイルの一番上に移動するつもりです。最初は、sedを使用して一致するテキストブロックを見つけて、sedを使用してスペースを節約するネストされたsedコマンドが必要だと思う問題があります。 Ubuntu23.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アドレス指定された行を行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

2つを組み合わせると、最終結果が得られます。

$ (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

関連情報