sed를 사용하여 패턴에서 한 사례를 뺀 모든 발생을 바꾸는 방법은 무엇입니까?

sed를 사용하여 패턴에서 한 사례를 뺀 모든 발생을 바꾸는 방법은 무엇입니까?

30분마다 cron 작업을 통해 다음과 같은 출력을 생성하는 임시 파일이 있습니다.

---- kind=<data> field=<value> humankind=<data> kind=<data> field=<value> humankind=<data> kind=<data> field=<value> humankind=<data>

다음과 같이 포맷하고 싶습니다.

---- kind=<data> field=<value> humankind=<data>
kind=<data> field=<value> humankind=<data>
kind=<data> field=<value> humankind=<data>

다음 sed 표현식을 시도했습니다.

sed -r 's|\s(kind=)|\n\1|g' /path/to/file

그러나 출력은 다음과 같습니다.

----                                         <------ The first line should be here
kind=<data> field=<value> humankind=<data>
kind=<data> field=<value> humankind=<data>
kind=<data> field=<value> humankind=<data>

이 표현을 사용하면:

sed -r 's|[^-]{4} (kind=)|\n\1|g' /path/to/file

내가 원하는 출력을 생성하지만 이상한 동작이 발생합니다.

---- kind=<data> field=<value> humankind=<incomplete data>
kind=<data> field=<value> humankind=<incomplete data>
kind=<data> field=<value> humankind=<incomplete data>

어떤 이유로 sed 표현식에 사용된 패턴의 일부를 포함하는 마지막 필드는 '불완전한 데이터'의 처음 두 문자만 인쇄합니다.

내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변1

문제는 sed -r 's|\s(kind=)|\n\1|g' /path/to/file첫 번째 항목을 포함하여 모든 '종류' 발생에 대해 새 줄을 삽입하여 뒤에 추가 줄 바꿈을 얻는다는 것입니다 ----. 대신 시도해 보세요.

sed -E 's|\s(kind=)|\n\1|2g' /path/to/file

첫 번째 경기를 건너뛰기 때문입니다.

두 번째는 'kind' 앞의 4문자와 일치하고 이는 데이터의 일부이기 때문에 실패합니다(길이는 6자여야 함)!

관련 정보