.
다음과 유사한 텍스트 파일이 있습니다.
A
B
C
D
E
F
G
다음을 수행해야 합니다.
E
행을 행 앞으로 이동C
;C
줄을 다음으로 바꾸십시오X
(X
여러 줄일 수 있음).G
줄을 다음으로 바꾸십시오Y
(Y
여러 줄일 수 있음).- 행을 삭제
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
. 그러나 이는 , , ... 행이 정렬되어 있다고 가정합니다. 즉, 와 사이에 아무 것도 없습니다.C
E
A
B
G
C
D
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
이동합니다 .PAT1
PAT2
이 명령은 일치하는 줄을 로 끝나는 다음 줄로 /PAT/c
변경합니다 .PAT
.
이 g/PAT/d
명령은 일치하는 모든 줄로 이동하여 PAT
삭제합니다.
예제를 보다 일반적으로 만들기 위해 @don_crissti의 제안에 따라 작업 순서를 변경했습니다( 삽입된 행이 또는 패턴과 일치할 수 있는 X1
경우 처리 ).Y1
/D/
/F/