다중 명령 sed 파일에서 한 줄을 다른 줄 앞으로 이동

다중 명령 sed 파일에서 한 줄을 다른 줄 앞으로 이동

.

다음과 유사한 텍스트 파일이 있습니다.

A
B
C
D
E
F
G

다음을 수행해야 합니다.

  1. E행을 행 앞으로 이동 C;
  2. C줄을 다음으로 바꾸십시오 X( X여러 줄일 수 있음).
  3. G줄을 다음으로 바꾸십시오 Y( Y여러 줄일 수 있음).
  4. 행을 삭제 D하고 F.

이것은 sed내가 지금 가지고 있는 파일입니다:

/C/ c\
X
/G/ c\
Y
/D/ d
/F/ d

2, 3, 4는 실행되지만 1은 실행되지 않습니다. E이전으로 이동하도록 스크립트를 수정하려면 어떻게 해야 합니까 C?

참고: 줄 번호나 줄 연속성은 신뢰할 수 없으며 패턴 일치에만 의존할 수 있습니다.

답변1

특정 사례의 경우 다음을 수행합니다.

sed '
/C/,/E/ {
        s/[CD]/&/
        t s
        s/E.*/&\
X1\
X2/
        t e
        H
        :s
        d
        :e
        p
        x
        D
}
/F/d
/G/c\
Y1\
Y2
' file

나보다 똑똑한 사람이라면 더 간단한 방법으로 이 작업을 수행할 수 있습니다 D. 그러나 이는 , , ... 행이 정렬되어 있다고 가정합니다. 즉, 와 사이에 아무 것도 없습니다.CEABGCD

ed일반적으로 이와 같은 상황은 다음을 사용하여 더 명확하게 수행할 수 있습니다 ex.

$ ed <<'EOT' -s file
/E/m/C/-1
g/D/d
g/F/d
/C/c
X1
X2
.
/G/c
Y1
Y2
.
w
EOT

$ cat file
A
B
E
X1
X2
Y1
Y2

이 명령은 일치하는 줄을 일치하는 줄 앞으로 /PAT1/m/PAT2/-1이동합니다 .PAT1PAT2

이 명령은 일치하는 줄을 로 끝나는 다음 줄로 /PAT/c변경합니다 .PAT.

g/PAT/d명령은 일치하는 모든 줄로 이동하여 PAT삭제합니다.

예제를 보다 일반적으로 만들기 위해 @don_crissti의 제안에 따라 작업 순서를 변경했습니다( 삽입된 행이 또는 패턴과 일치할 수 있는 X1경우 처리 ).Y1/D//F/

관련 정보