두 번째 줄을 모두 굵게 표시

두 번째 줄을 모두 굵게 표시

두 줄에 걸쳐 제목과 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

perlLWP, JSON및 모듈을 사용하여 Term::ANSIColor이를 달성하는 한 가지 방법은 다음과 같습니다 . Term::ANSIColor핵심 Perl 모듈 이지만 LWPJSONCPAN기준 치수. 이는 매우 일반적으로 사용되는 모듈이므로 배포용으로 미리 패키지되어 제공될 수도 있습니다(예: 데비안 등 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 이 두 가지 기능을 사용하면 모든 작업과 그 이상 을 수행할 수 있습니다.wgetawkcutgrepawkcutgrepawkawkperl

예를 들어 다른 이름으로 저장하고 ./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, dateMillisformattedDate는 인쇄하는 데나 perl hashref 변수의 다른 목적뿐만 아니라 인쇄하는 합계에도 mainPicURL사용할 수 있습니다 .$hheadlineurl

관련 정보