각 패턴 일치 앞에 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);
}

관련 정보