특정 단어가 나타나는 마지막 줄의 문자 제거

특정 단어가 나타나는 마지막 줄의 문자 제거

다음과 같은 파일 예제가 있습니다.

단어가 존재하는 , 마지막 줄의 문자를 제거하고 싶습니다.topic

more file

{"topic":"life_is_hard","partition":84,"replicas":[1006,1003]},
{"topic":"life_is_hard","partition":85,"replicas":[1001,1004]},
{"topic":"life_is_hard","partition":86,"replicas":[1002,1005]},
{"topic":"life_is_hard","partition":87,"replicas":[1003,1006]},
{"topic":"life_is_hard","partition":88,"replicas":[1004,1001]},
{"topic":"life_is_hard","partition":89,"replicas":[1005,1002]},
{"topic":"life_is_hard","partition":90,"replicas":[1006,1004]},
{"topic":"life_is_hard","partition":91,"replicas":[1001,1005]},
{"topic":"life_is_hard","partition":92,"replicas":[1002,1006]},
{"topic":"life_is_hard","partition":93,"replicas":[1003,1001]},
{"topic":"life_is_hard","partition":94,"replicas":[1004,1002]},
{"topic":"life_is_hard","partition":95,"replicas":[1005,1003]},
{"topic":"life_is_hard","partition":96,"replicas":[1006,1005]},
{"topic":"life_is_hard","partition":97,"replicas":[1001,1006]},
{"topic":"life_is_hard","partition":98,"replicas":[1002,1001]},
{"topic":"life_is_hard","partition":99,"replicas":[1003,1002]},

예상 출력

{"topic":"life_is_hard","partition":84,"replicas":[1006,1003]},
{"topic":"life_is_hard","partition":85,"replicas":[1001,1004]},
{"topic":"life_is_hard","partition":86,"replicas":[1002,1005]},
{"topic":"life_is_hard","partition":87,"replicas":[1003,1006]},
{"topic":"life_is_hard","partition":88,"replicas":[1004,1001]},
{"topic":"life_is_hard","partition":89,"replicas":[1005,1002]},
{"topic":"life_is_hard","partition":90,"replicas":[1006,1004]},
{"topic":"life_is_hard","partition":91,"replicas":[1001,1005]},
{"topic":"life_is_hard","partition":92,"replicas":[1002,1006]},
{"topic":"life_is_hard","partition":93,"replicas":[1003,1001]},
{"topic":"life_is_hard","partition":94,"replicas":[1004,1002]},
{"topic":"life_is_hard","partition":95,"replicas":[1005,1003]},
{"topic":"life_is_hard","partition":96,"replicas":[1006,1005]},
{"topic":"life_is_hard","partition":97,"replicas":[1001,1006]},
{"topic":"life_is_hard","partition":98,"replicas":[1002,1001]},
{"topic":"life_is_hard","partition":99,"replicas":[1003,1002]}

sed (GNU sed) 4.2.2

답변1

GNU sed 및 tac 사용:

tac bad.json | sed '0,/"topic"/s/,$//' | tac

줄 뒤에 공백이 있는 경우 패턴을 다음으로 변경합니다.,[[:blank:]]*$

답변2

이와 같이:

sed -i '${s/,[[:blank:]]*$//}' file

이 명령은 파일을 대체합니다비행 중.

답변3

GNU sed확장 정규식 모드를 사용하면 -r다음과 같은 작업을 수행할 수 있습니다.

sed -ri -e '
   /"topic"/{
      x;1!p;ba
   }
   H;1h;:a;$!d;g
   //s/^([^\n]+),(\n|$)/\1\2/
' file

기본 아이디어는 "topic"(아무리 멀리 떨어져 있더라도) 다음 줄까지의 줄 시작을 포함하는 줄을 예약된 공간에 모으는 것입니다. 그런 다음 마침내 eof에 도달하면 ,줄 끝(=> "topic" 줄이 마지막 줄임) 또는 첫 번째 줄 바꿈(=> "topic" 줄이 파일의 마지막 줄임)에서 삭제합니다. , 그러나 eof에 도달하기 전에 제목이 아닌 줄이 더 있습니다.

답변4

Python 메소드를 사용하여 완료됨

 #!/usr/bin/python
import re
k=re.compile(r',$')
t=open('filename','r')
l=[]
for i in t:
    l.append(i.strip())
for h in range(0,len(l),1):
    if (h <15):
        print l[h]
    else:
        print re.sub(k,"",l[h])

산출

{"topic":"life_is_hard","partition":84,"replicas":[1006,1003]},
{"topic":"life_is_hard","partition":85,"replicas":[1001,1004]},
{"topic":"life_is_hard","partition":86,"replicas":[1002,1005]},
{"topic":"life_is_hard","partition":87,"replicas":[1003,1006]},
{"topic":"life_is_hard","partition":88,"replicas":[1004,1001]},
{"topic":"life_is_hard","partition":89,"replicas":[1005,1002]},
{"topic":"life_is_hard","partition":90,"replicas":[1006,1004]},
{"topic":"life_is_hard","partition":91,"replicas":[1001,1005]},
{"topic":"life_is_hard","partition":92,"replicas":[1002,1006]},
{"topic":"life_is_hard","partition":93,"replicas":[1003,1001]},
{"topic":"life_is_hard","partition":94,"replicas":[1004,1002]},
{"topic":"life_is_hard","partition":95,"replicas":[1005,1003]},
{"topic":"life_is_hard","partition":96,"replicas":[1006,1005]},
{"topic":"life_is_hard","partition":97,"replicas":[1001,1006]},
{"topic":"life_is_hard","partition":98,"replicas":[1002,1001]},
{"topic":"life_is_hard","partition":99,"replicas":[1003,1002]}

관련 정보