sed

sed

나는 가지고있다 filename.json. 터미널에서 구문 분석하면

file filename.json

출력은 다음과 같습니다

filename.json: UTF-8 Unicode text, with very long lines  

wc -l filename.json    
1 filename.json

이를 json사용하여 구문 분석하는 경우 jqID, 요약, 작성자 등과 같이 인쇄하려는 데이터 부분을 언급해야 합니다. 비슷한 구조를 가진 수천 개의 json이 있지만 데이터를 "요약", "설명", "검토" 등으로 저장하고 싶습니다. 수천 개의 JSON 파일이 있으므로 하나하나 확인하고 싶지 않습니다. 하지만 내가 원하는 데이터가 두 스키마 사이에 있다는 것을 알고 있습니다.

"제목":그리고 "URL":

$ cat filename.json

다음을 제공합니다:

{"source":"PhoneArena","author":"","title":"Apple's US Black Friday shopping event has gift cards galore for select iPhones, iPads, and more","description":"As confirmed earlier this week, a four-day Black Friday and Cyber Monday shopping event is underway, offering Apple Store gift cards with purchases of select iPhone models, three iPad variants, an assortment of Macs, the entire Apple Watch Series 3 family, as well as the HomePod, both Apple TV versions, and select Beats headphones.That ...","url":"https://www.phonearena.com/news/Apples-US-Black-Friday-shopping-event-has-gift-cards-galore-for-select-iPhones-iPads-and-more_id111287","urlToImage":"https://i-cdn.phonearena.com/images/article/111287-two_lead/Apples-US-Black-Friday-shopping-event-has-gift-cards-galore-for-select-iPhones-iPads-and-more.jpg","publishedAt":"2018-11-23T09:05:00Z","dataRefreshedTime":"2018-11-23T09:43:09Z","category":"phone_news_reviews","resource":"PhoneArena"},{"source":"PhoneArena","author":"","title":"Verizon's top Black Friday bargain is a free Moto G6, no trade-in required","description":"That made it virtually impossible for retailers like Best Buy and B&H Photo Video to outdo themselves come the actual Black Friday frenzy, but luckily, that’s what carriers are (sometimes) good for.Enter Verizon, which revealed a wide range of killer deals on popular high-end ...","url":"https://www.phonearena.com/news/Verizons-top-Black-Friday-bargain-is-a-free-Moto-G6-no-trade-in-required_id111285","urlToImage":"https://i-cdn.phonearena.com/images/article/111285-two_lead/Verizons-top-Black-Friday-bargain-is-a-free-Moto-G6-no-trade-in-required.jpg","publishedAt":"2018-11-23T07:54:00Z","dataRefreshedTime":"2018-11-23T09:43:09Z","category":"phone_news_reviews","resource":"PhoneArena"},

그래서 패턴 사이의 모든 것을 인쇄하고 싶지만 터미널에는 파일이 한 줄만 있고 패턴이 여러 번 나타납니다. 제가 생각하는 유일한 방법은 두 패턴 사이에서 파일 끝까지 인쇄하는 것 뿐입니다.

나는 sed를 사용해 본다:

sed -n '^/title/,/^url/p' filename.json

하지만 공백으로 인쇄됩니다.

기계 학습 기술을 사용하여 언어 분석을 위한 데이터를 추가로 입력하고 싶습니다.

패턴 사이를 인쇄하고 패턴을 여러 번 반복하는 다른 방법에 대한 제안 사항입니다. 따라서 각 반복 사이에 데이터가 인쇄되기를 원합니다.

예상되는 결과는 CSV 또는 TSV로 인쇄하는 것입니다.

1 "As confirmed earlier this week, a four-day Black Friday and Cyber Monday shopping event is underway, offering Apple Store gift cards with purchases of select iPhone models, three iPad variants, an assortment of Macs, the entire Apple Watch Series 3 family, as well as the HomePod, both Apple TV versions, and select Beats headphones.That ..."

2 "That made it virtually impossible for retailers like Best Buy and B&H Photo Video to outdo themselves come the actual Black Friday frenzy, but luckily, that’s what carriers are (sometimes) good for.Enter Verizon, which revealed a wide range of killer deals on popular high-end ..."

etc,.

파일 끝까지.

답변1

긴 이야기 짧게

ksh, bash, zsh에서:

sed -e $'s,"title":,\1,g' -e $'s,"url":,\2,g' -e $'s,^[^\1]*,,' -e $'
         s,\1\\([^\2]*\\)\2[^\1]*,\\1\\\n,g' infile

sed

문자 구분 기호입니다.

표준 용액캐릭터@구분 기호는 다음과 같다고 가정합니다 #.

sed 's,^[^@]*,,;s,@\([^#]*\)#[^@]*,\1 ,g' infile

이렇게 하면 시작 부분에서 아닌 모든 문자가 제거됩니다. @ - 사이에 있는 문자가 추출됩니다.첫 번째 @ 다음으로첫 번째 #다음.

각각철사입력 파일 infile.

범용 구분 기호.

각 구분 기호 문자열을 위의 답변으로 간단히 변환하면 다른 구분 기호를 변환할 수 있습니다.하나특징.

sed -e 's,"title":,@,g' -e 's,"url":,#,g' -e 's/^[^@]*//;s/@\([^#]*\)#[^@]*/\1 /g' infile

귀하의 경우 공백( ) 대신 개행 문자를 사용할 수 있습니다. 이는 GNU sed( ) \1용으로 작성할 때 간단합니다 .\1\n

sed -e 's,"title":,@,g' -e 's,"url":,#,g' -e 's/^[^@]*//;s/@\([^#]*\)#[^@]*/\1\n/g' infile

다른 (이전) sed의 경우 명시적인 줄 바꿈을 추가합니다.

sed -e 's,"title":,@,g' -e 's,"url":,#,g' -e 's/^[^@]*//;s/@\([^#]*\)#[^@]*/\1\
/g' infile

위에 사용된 구분 기호가 파일 내부에 있을 위험이 있는 경우 파일 내부에 존재하지 않는 다른 구분 기호를 선택하십시오. 이것이 문제가 되는 경우 시작 및 끝 구분 기호는 Ctrl- A(또는 인코딩: ^A, hex: Ox01또는 8진수 \001)와 같은 제어 문자일 수 있습니다. Ctrl- - 를 입력하여 V Ctrl쉘 콘솔에 이를 입력 할 수 있습니다 A. 명령줄에 ^A가 표시됩니다.

sed -e 's,"title":,^A,g' -e 's,"url":,^B,g' -e 's,^[^^A]*,,;s,^A\([^^B]*\)^B[^^A]*,\1\n,g' infile

또는 입력이 너무 어렵다면 (ksh, bash, zsh)를 사용할 수 있습니다.

sed -e $'s,"title":,\1,g' -e $'s,"url":,\2,g' -e $'s,^[^\1]*,,' -e $'s,\1\\([^\2]*\\)\2[^\1]*,\\1\\\n,g' infile

또는 귀하의 sed가 이를 지원하는 경우:

sed -e 's,"title":,\o001,g' -e 's,"url":,\o002,g' -e 's,^[^\o001]*,,' -e 's,\o001\([^\o002]*\)\o002[^\o001]*,\1\o012,g' infile

구분 기호가 "설명"인 경우:

"description":시작 태그가 실제로 (출력 예제에서) 있으면 대신 사용하십시오."title":

위의 출력(질문에서 이전에 연결한 파일에서):

"Black Friday deal: Palm companion phone is $150 off at Verizon, but there's a catch","description":"",
"LG trademarks potential names for its foldable phone, one fits a crazy concept found in patents","description":"",
"Blackview's Black Friday promo discounts the BV9500 Pro and other rugged phones on Amazon","description":"Advertorial by Blackview: the opinions expressed in this story may not reflect the positions of PhoneArena! disclaimer   amzn_assoc_tracking_id = 'phone0e0d-20';amzn_assoc_ad_mode = 'manual';amzn_assoc_ad_type ...",

줄 번호를 매겨야 하는 경우 sed를 다시 사용하십시오 sed -n '=;p;g;p'.

| sed -n '=;p;g;p'
1
"Black Friday deal: Palm companion phone is $150 off at Verizon, but there's a catch","description":"",

2
"LG trademarks potential names for its foldable phone, one fits a crazy concept found in patents","description":"",

3
"Blackview's Black Friday promo discounts the BV9500 Pro and other rugged phones on Amazon","description":"Advertorial by Blackview: the opinions expressed in this story may not reflect the positions of PhoneArena! disclaimer   amzn_assoc_tracking_id = 'phone0e0d-20';amzn_assoc_ad_mode = 'manual';amzn_assoc_ad_type ...",

AWK

awk에 구현된 유사한 논리:

awk -vone=$'\1' -vtwo=$'\2' '{
            gsub(/"title":/,one);
            gsub(/"url":/,two);
            sub("^[^"one"]*"one,"")
            gsub(two"[^"one"]*"one,ORS)
            sub(two"[^"two"]*$","")
           } 1' infile

관련 정보