sed: 첫 번째 문자열을 제외한 모든 문자열을 삭제합니다.

sed: 첫 번째 문자열을 제외한 모든 문자열을 삭제합니다.

타임스탬프가 포함된 로그 파일이 있습니다. 때로는 여러 개의 타임스탬프가 연속적으로 있는 경우도 있습니다. 이제 행에서 모든 타임스탬프를 제거하고 첫 번째 타임스탬프는 유지하고 싶습니다.

나는 이것을 할 수 있지만 s/pattern//2이렇게 하면 두 번째 항목만 제거되고 sed유사한 항목은 허용되지 않습니다 s/pattern//2-.

어떤 제안이 있으십니까?

답변1

GNU 사용 sed:

sed 's/pattern//2g'

2두 번째 패턴과 나머지 모든 패턴을 삭제하도록 지정합니다 g. 따라서 첫 번째 항목이 유지됩니다.

답변2

이렇게 하면 작동합니다(로그와 충돌하는 경우 _를 다른 것으로 바꾸십시오).

sed -e 's/pattern/_&/1' -e 's/\([^_]\)pattern//g' -e 's/_\(pattern\)/\1/'

답변3

sed -e ':begin;s/pattern//2;t begin'

또는 sed goto를 사용하지 않고:

sed -e 's/\(pattern\)/\1\n/;h;s/.*\n//;s/pattern//g;H;g;s/\n.*\n//'

n번째(예: 3) 위치에서 삭제하는 일반적인 솔루션은 다음과 같습니다.

sed -e ':begin;s/pattern//4;t begin'
sed -e 's/\(pattern\)/\1\n/;h;s/.*\n//3;s/pattern//g;H;g;s/\n.*\n//'

답변4

@jillagre의 답변은 약간 다릅니다.(강건성을 위해 수정됨)다음과 같이 보일 수 있습니다:

sed 's/p\(attern\)/p\n\1/;s///g;s/\n//'

...그러나 어떤 경우에는 첫 번째 교체 문의 오른쪽을 리터럴 ewline 문자 로 바꿔야 sed할 수도 있습니다 .ns///\n

관련 정보