各パターンマッチの前に5行のテキストを挿入する

各パターンマッチの前に5行のテキストを挿入する

同様の文脈で、パターン(例えば、RotX)が複数回繰り返されるファイルがあります。各行の先頭(各パターンマッチの前に5行)に特定のテキスト(例えば、Rot-X)を挿入する必要があります。

...

_face_641
{
    type wall;
    nFaces 6;
    startFace 63948413;
    inGroups       1(RotX);
}

_face_821
{
    type wall;
    nFaces 3;
    startFace 63948419;
    inGroups       1(RotX);
}

_face_67
{
    type wall;
    nFaces 3;
    startFace 63948422;
    inGroups       1(RotX);
}

...

しなければならない

...

Rot-X_face_641
{
    type wall;
    nFaces 6;
    startFace 63948413;
    inGroups       1(RotX);
}

Rot-X_face_821
{
    type wall;
    nFaces 3;
    startFace 63948419;
    inGroups       1(RotX);
}

Rot-X_face_67
{
    type wall;
    nFaces 3;
    startFace 63948422;
    inGroups       1(RotX);
}

...        

sedまたはawkを使用してこれを実行できますか?

助けてくれてありがとう。

答え1

簡単な2段階の方法を使用してください。

$ awk 'NR==FNR{ if (/RotX/) nrs[NR-5]; next } FNR in nrs{ $0="Rot-X" $0 } 1' file file
...

Rot-X_face_641
{
    type wall;
    nFaces 6;
    startFace 63948413;
    inGroups       1(RotX);
}

Rot-X_face_821
{
    type wall;
    nFaces 3;
    startFace 63948419;
    inGroups       1(RotX);
}

Rot-X_face_67
{
    type wall;
    nFaces 3;
    startFace 63948422;
    inGroups       1(RotX);
}

...

答え2

vimを使う

vim -c "g/RotX/norm 5kIRot-x" -c "wq" file.txt

edを使う:@steeldriver経由

printf '%s\n' 'g/(RotX)/-5s/^/Rot-X/' 'wq' | ed -s file.txt

上記の4行の中かっこが{必ずしも必要でない場合、その他は形式が同じです。

vim -c "g/RotX/norm [{kIRot-X" -c "wq" file.txt
printf "%s\n" 'g/RotX/?^{$?-1s/^/Rot-X/' 'wq' | ed -s file.txt

答え3

awkを使ってパスを作成します。

# insert_before_match.awk
{
    p6=p5
    p5=p4
    p4=p3
    p3=p2
    p2=p1
    p1=$0

    if ($0 ~ /RotX/) {
        print "Rot-X"p6
        print p5
        print p4
        print p3
        print p2
        print p1
        print "}"
        print ""
    }

}

$awk -f insert_before_match.awk ファイル

Rot-X_face_641
{
    type wall;
    nFaces 6;
    startFace 63948413;
    inGroups       1(RotX);
}

Rot-X_face_821
{
    type wall;
    nFaces 3;
    startFace 63948419;
    inGroups       1(RotX);
}

Rot-X_face_67
{
    type wall;
    nFaces 3;
    startFace 63948422;
    inGroups       1(RotX);
}

関連情報