» »

Izpis z awk med več vzorci (patterni)

Izpis z awk med več vzorci (patterni)

poweroff ::

Imam Markdown datoteke z naslednjo vsebino
---
title: Naslov besedila
date: 2020-01-01T00:00:00+00:00
author: Ime Avtorja
layout: default
permalink: /blah/blah/
categories:
  - Prva
  - Morda tudi druga
tags:
  - prvi
  - drugi 
  - morda tretji
---
Besedilo, besedilo, besedilo, besedilo,...


V bashu bi rad izpisal zadevo tako, da bo ven padla CSV (tab delimited) datoteka s strukturo:

Naslov besedila \t Besedilo, besedilo, besedilo, besedilo,...


Opcija je tudi:
Naslov besedila \t 2020-01-01T00:00:00+00:00 \t Besedilo, besedilo, besedilo, besedilo,...


Z awk znam narediti izpis med dvema patternoma. Kaj pa med več dvojicami patternov?
sudo poweroff

Spura ::

Tuki se ti zna zgodit da bos velik vec cajta porabu za to v bashu napisat, kot pa v cem drugem.

Ce bi rad napisal z awk in znas matchat eno vrednost ne pa dveh, ti predlagam, da preprosto pozenes veckrat cez file. Najprej pozenes cez file in poberes vse naslove besedila v en temp file. Potem pozenes cez isti file awk in poberes vsa besedila. Pol pa oba temp fajla skombiniras in das tab med vrednosti. Lahko pozenes se tretjic pa poberes vse datume.

Zgodovina sprememb…

  • spremenil: Spura ()

sas084 ::

Probi si napisat "state machine" awk skripto, recimo kot primer:
#!/usr/bin/awk -f

#
# 'begin' blok - izvede se 1x
#
BEGIN {
  inside_mark = 0;
  skip_print = 0;
}

#
# zacetka/konca bloka
#
/^---$/ {
  if (inside_mark) {
    inside_mark = 0;
    skip_print = 1;
  }
  else {
    inside_mark = 1;
  }
}

#
# vzorec 'title'
#
/^title\:/ {
  if (inside_mark) {
    printf "%s\t\t", substr($0, 8)
  }
}

#
# ustreza vsem vzorcem
#
{
  if (!inside_mark && !skip_print) {
    printf "%s", $0
  }
  if (skip_print) {
    skip_print = 0;
  }
}

#
# 'end' blok, izvede se 1x
#
END {
}

Skripta je napisana na pamet in sigurno ne dela za vse kombinacije inputa, služi le kot primer.

poweroff ::

Imaš prav. Python to the rescue.

Zelo na hitro spisana koda (gotovo se da še ful optimizirat, glede na to, da ne znam programirati)

#!/usr/bin/python3
import re
import sys
from pathlib import Path

def cleanhtml(raw_html):
  cleanr = re.compile('<.*?>|&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-f]{1,6});')
  cleantext = re.sub(cleanr, '', raw_html)
  return cleantext

filename = sys.argv[1]
txt = Path(filename).read_text()

txt = txt.split("\n",1)[1]
txt = txt.replace('\n', ' ')
txt = txt.replace('\t', ' ')
txt = txt.replace('*', '')
txt = cleanhtml(txt)
txt = txt.replace('\.', ' \.')
txt = ' '.join(txt.split())

naslov = re.search('title: (.*)date:', txt)
vsebina = re.search('--- (.*)', txt)

print(naslov.group(1).strip() + "\t" + vsebina.group(1).strip())


Potem pa v bashu rečem:
for f in *.md; do python3 pretvori.py $f >> clanki.csv; done


...pa pade ven tab-delimited CSV datoteka.
sudo poweroff

Spura ::

Fora je k si najprej zbrisal newlines pa podobno, da potem si prisiljen met regex kot je 'title: (.*)date:', ce bi pa najprej razparceliral podatke pa potem pucal vn posebne znake bi lahko lepo po vrsticah matchal. Zdej pa ce se ti zgodi, da `date:` manjka, ti tudi titlea ne bo matchal. Plus, seveda, z regexi tezko odstranis vse posebne znake, recimo dal si vn * za bold, ampak _ in __ pa ostanejo notri (so tudi markdown). Pa HTML espace sekvence si odstranil ampak to lahko pomeni da bodo manjkal znaki.

Meni ne smeta uporabljat knjiznjic in bi lepo pretvoru markdown v html, potem pa bi vse feedal v html parser, in potem iz rezultata obdrzal samo stringe.

poweroff ::

Ja, se strinjam, je precej neumno narejeno. Ampak za moj namen deluje (datuma v bistvu ne rabim).
sudo poweroff


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Slo-Tech userscripts

Oddelek: Izdelava spletišč
175174 (2626) jype
»

Bash skripta

Oddelek: Programiranje
243243 (2555) poweroff
»

Unicode decode

Oddelek: Programiranje
121962 (1420) Randomness
»

Bash

Oddelek: Programiranje
192309 (1705) keworkian
»

Javascript in zunanja datoteka

Oddelek: Izdelava spletišč
10876 (724) hamax

Več podobnih tem