타임스탬프가 포함된 로그 파일이 있습니다. 때로는 여러 개의 타임스탬프가 연속적으로 있는 경우도 있습니다. 이제 행에서 모든 타임스탬프를 제거하고 첫 번째 타임스탬프는 유지하고 싶습니다.
나는 이것을 할 수 있지만 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
할 수도 있습니다 .n
s///
\n