ディレクトリに多数のテキストファイルがあり、最初のコメントセクションを切り取り、ファイルの先頭に貼り付けたいです(コメントテキストは長さと開始点が異なり、場合によっては存在しない場合があります)。最初の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