두 줄에 걸쳐 제목과 URL 쌍을 반환하는 다음 bash 명령이 있습니다.
curl -s https://uk.reuters.com/assets/jsonWireNews |
awk '/"url":|"headline":/' |
cut -d'"' -f4 |
awk 'NR % 2 == 0 {sub(/^/,"https://uk.reuters.com")} {print}'
처음 3개 타이틀에 대해 다음을 출력합니다.
'Hamilton' takes centre stage in London's West End
https://uk.reuters.com/article/uk-britain-theatre-hamilton/hamilton-takes-centre-stage-in-londons-west-end-idUKKBN1EG02I
IAG among bidders chosen for Austrian airline Niki - sources
https://uk.reuters.com/article/uk-air-berlin-niki/iag-among-bidders-chosen-for-austrian-airline-niki-sources-idUKKBN1EG1BM
Oil eases from highs but OPEC cuts still support market
https://uk.reuters.com/article/uk-global-oil/oil-eases-from-highs-but-opec-cuts-still-support-market-idUKKBN1EG06G
헤드라인, 즉 첫 번째 줄부터 시작하는 다른 모든 줄을 굵게 표시하고 싶습니다.
'해밀턴'이 런던 웨스트엔드의 중심 무대를 차지하다 https://uk.reuters.com/article/uk-britain-theatre-hamilton/hamilton-takes-centre-stage-in-londons-west-end-idUKKBN1EG02I 오스트리아 항공사 Niki의 선정된 입찰자 중 IAG - 출처 https://uk.reuters.com/article/uk-air-berlin-niki/iag-among-bidders-chosen-for-austrian-airline-niki-sources-idUKKBN1EG1BM 유가는 고점에서 하락했지만 OPEC 감산은 여전히 시장을 지지하고 있습니다. https://uk.reuters.com/article/uk-global-oil/oil-eases-from-highs-but-opec-cuts-still-support-market-idUKKBN1EG06G
답변1
이 시도
#!/bin/bash
curl -s https://uk.reuters.com/assets/jsonWireNews |
awk '/"url":|"headline":/' |
cut -d'"' -f4 |
awk '/^\// { print "\033[0mhttps://uk.reuters.com:" $0; next } {print "\033[1m" $0 }'
"^/"의 시작 부분과 일치하면 굵지 않은 bash 이스케이프를 인쇄하고 다음 줄로 이동합니다. 기본적으로 인쇄에서는 각 줄 앞에 bash로 이스케이프된 굵은 접두사가 추가됩니다.
답변2
질문의 첫 번째 버전에 대한 귀하의 아이디어는 정확합니다. 문제는 인쇄할 수 tput
있도록 제어 코드를 인쇄하는 방법입니다 .awk
변수 및 명령 대체는 ''
작은따옴표( ) 내에서 확장되지 않으므로 큰따옴표를 사용해야 합니다. 그러나 이스케이프해야 할 다른 문자가 있을 수 있으므로 awk
코드에서 이를 사용하는 것은 어색할 수 있습니다 (말장난 의도는 아님) . 확장하려는 부분의 기간 동안 작은따옴표를 끄고 큰따옴표로 묶인 문자열을 시작할 수 있습니다.
$bold="$(굵게 표시)" $normal="$(tput sgr0)" $ echo -e 'foo\nbar\ndoo' | awk '{if (NR % 2) print "'"$bold"'" $0 "'"$normal"'"; 부자 술집 뒤
( 에서 "'"$bold"'"
첫 번째는 "
awk 코드의 일부인 텍스트입니다. '
끝은 작은따옴표 문자열이고 "
시작은 큰따옴표 문자열이며 다른 "'"
순서는 역순으로 동일합니다.)
이것은 약간 추악합니다. 또 다른 방법은 awk
제어 코드를 변수로 전달하는 것입니다.
$ echo -e 'foo\nbar\ndoo' | awk -vbold="$bold" -vnormal="$normal" '{if (NR % 2) 굵은 글씨 $0 그렇지 않으면 인쇄;}' 부자 술집 뒤
(물론 환경에 전달할 수도 있습니다.)
답변3
잠깐 살펴본 후 다음을 man tput
시도했습니다.
$ bold=`tput smso`
$ normal=`tput rmso`
$ echo "${bold}Please type in your name: ${normal}\c"
효과가 있는 것 같군요...그래서 계속할 수 있는 기회가 많겠죠?
답변4
perl
LWP
, JSON
및 모듈을 사용하여 Term::ANSIColor
이를 달성하는 한 가지 방법은 다음과 같습니다 . Term::ANSIColor
핵심 Perl 모듈 이지만 LWP
및JSON
CPAN기준 치수. 이는 매우 일반적으로 사용되는 모듈이므로 배포용으로 미리 패키지되어 제공될 수도 있습니다(예: 데비안 등 apt-get install libjson-perl libwwww-perl
).
#!/usr/bin/perl
use strict;
use LWP::UserAgent;
use JSON;
use Term::ANSIColor;
my $bold = color('bold');
my $reset = color('reset');
my $base='https://uk.reuters.com'
foreach my $url (@ARGV) {
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => $url);
my $res = $ua->request($req);
if ($res->is_success) {
foreach my $h ( @{ decode_json($res->content)->{headlines} }) {
print $bold, $h->{headline}, $reset, "\n", $base, $h->{url}, "\n\n";
};
} else {
die "Error processing '$url': ", $res->status_line, "\n";
}
}
이것은 여러 번의 호출이 필요하지 않으며 curl
및 /또는 (이러한 추악함으로 인해 답변을 작성하게 되었습니다. 일반적으로 파이프를 연결하거나 자체에 연결하는 경우 잘못하고 있는 것입니다 . 파이프 또는 연결에 대해서도 마찬가지 입니다. done 이 두 가지 기능을 사용하면 모든 작업과 그 이상 을 수행할 수 있습니다.wget
awk
cut
grep
awk
cut
grep
awk
awk
perl
예를 들어 다른 이름으로 저장하고 ./bold-2nd.pl
실행 가능하게 만든 chmod
후 다음과 같이 실행하십시오.
$ ./bold-2nd.pl https://uk.reuters.com/assets/jsonWireNews 스코틀랜드 왕립은행(Royal Bank of Scotland)은 캘리포니아 모기지 채권 청구를 해결하기 위해 1억 2,500만 달러를 지불했습니다. https://uk.reuters.com/article/uk-rbs-settlement/rbs-to-pay-125-million-to-settle-california-mortgage-bond-claims-idUKKBN1EH053 호주 차량 공격에 대한 살인미수 혐의로 기소된 운전자 https://uk.reuters.com/article/uk-australia-attack/driver-charged-with-attempted-murder-over-australian-vehicle-attack-idUKKBN1EH044 EasyJet은 다른 항공사들이 Tegel에서 출발하는 지역 항공편에 관심이 있다고 말했습니다. https://uk.reuters.com/article/uk-air-berlin-ma-easyjet/easyjet-says-other-airlines-interested-in-feeder-flights-from-tegel-idUKKBN1EH04W [...]
이 버전의 스크립트는 명령줄에서 여러 URL을 처리할 수 있습니다(물론 모든 URL은 동일한 json 형식의 데이터를 반환해야 합니다...또는 적어도 a headline
및 a url
필드와 매우 유사한 것을 반환해야 합니다).
그런데 각 게시물 사이에 빈 줄을 인쇄하도록 했습니다. 나는 이것이 더 읽기 쉽다고 생각합니다.
curl
를 가져오기 위해 Perl 모듈 대신 사용하려는 경우 LWP
스크립트가 더 간단합니다.
#!/usr/bin/perl
use strict;
use JSON;
use Term::ANSIColor;
my $bold = color('bold');
my $reset = color('reset');
my $base='https://uk.reuters.com'
undef $/;
my $json = <>; # slurp in entire stdin
foreach my $h ( @{ decode_json($json)->{headlines} }) {
print $bold, $h->{headline}, $reset, "\n", $base, $h->{url}, "\n\n";
};
이 버전을 실행하세요:
$ curl -s https://uk.reuters.com/assets/jsonWireNew | ./bold-2nd.pl
굵은 스크립트의 두 버전 모두 특정 패턴과 일치하는 줄을 검색하기 위해 정규식을 사용하는 대신 json 파서를 사용하여 실제로 json 데이터를 구문 분석합니다. 이전에 여러 번 지적했듯이 정규식을 사용하여 json, html, xml 또는 유사한 구조화된 데이터 형식을 구문 분석하는 것은 신뢰할 수 없고 취약합니다. 간단한 경우에는 작동하지만 입력 형식이 조금만 변경되어도 스크립트가 손상될 수 있습니다(예: Reuters가 각 데이터 요소와 레코드 사이에 줄바꿈을 사용하여 예쁘게 인쇄된 json 출력을 중지하고 라인 기반 정규식 패턴 일치자를 인쇄하기 시작하는 경우). json의 한 줄이 깨집니다)
마지막으로 얻은 json 데이터(또는 LWP)는 curl
다음과 같습니다.
{ "headlines": [
{ "id": "UKKBN1EH044",
"headline": "Driver charged with attempted murder over Australian vehicle attack",
"dateMillis": "1514003249000",
"formattedDate": "3m ago",
"url": "/article/uk-australia-attack/driver-charged-with-attempted-murder-over-australian-vehicle-attack-idUKKBN1EH044",
"mainPicUrl": "https://s4.reutersmedia.net/resources/r/?m=02&d=20171223&t=2&i=1216634499&w=116&fh=&fw=&ll=&pl=&sq=&r=LYNXMPEDBM04W"
},
]}
따라서, id
, dateMillis
및 formattedDate
는 인쇄하는 데나 perl hashref 변수의 다른 목적뿐만 아니라 인쇄하는 합계에도 mainPicURL
사용할 수 있습니다 .$h
headline
url