sed : 첫 번째 문자열을 제외한 모든 문자열을 삭제


14

타임 스탬프가있는 로그 파일이 있습니다. 때때로 한 줄에 여러 개의 타임 스탬프가 있습니다. 이제 줄에서 모든 타임 스탬프를 제거하고 첫 번째 타임 스탬프를 유지하고 싶습니다.

할 수는 s/pattern//2있지만 두 번째 항목 만 제거하고 sed같은 것을 허용하지 않습니다 s/pattern//2-.

어떤 제안?


나는 그것이 busybox의 sed라고 들었습니다. 그 죄송합니다.
Folkert van Heusden 12

답변:


4

GNU로 sed:

sed 's/pattern//2g'

2지정은 두 번째 패턴과 모든 나머지는 g제거해야합니다. 그래서 이것은 첫 번째를 유지할 것입니다.


1
Cygwin에는 (항상 포트) 있고 MacOS에는 없습니다. 아! 이 솔루션은 훨씬 더 우아합니다.
r_alex_hall 2016 년

7

이것은 작동해야합니다 (_를 로그와 충돌하면 _를 다른 것으로 대체하십시오).

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

1
고유 한 구분자를 원한다면을 사용하십시오 \n.
mikeserv

5
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//'

1

@jillagre의 답변 (견고성을 위해 수정 됨)의 약간의 변형 은 다음과 같습니다.

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

... 어떤 경우에는 첫 번째 ubstitution 문의 오른쪽 에있는 문자를 ewline 문자 sed로 바꿔야 할 수도 있습니다 .ns///\n

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.