Byla vydána nová verze 9.18 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Nově také pro NanoPi R3S, R3S LTS, R76S a M5. Přehled novinek v poznámkách k vydání.
bat, tj. vylepšený cat se zvýrazňováním syntaxe a integrací s gitem, byl vydán ve verzi 0.26.0.
Byla vydána první verze 0.0.1 [Mastodon] multipatformního renderovacího jádra webového prohlížeče Servo (Wikipedie). Vývoj Serva započal v roce 2012 v Mozilla Corporation. V roce 2020 bylo Servo předáno nadaci Linux Foundation. Servo je napsané v programovacím jazyce Rust.
Cloudovou službu Amazon Web Services (AWS) americké firmy Amazon dnes postihl globální výpadek. Omezil dostupnost řady aplikací a webů, například populární platformu Snapchat nebo aplikaci s prvky umělé inteligence (AI) Perplexity. Podle webu Downdetector hlásily problémy také uživatelé obchodu Amazon, streamovací platformy PrimeVideo nebo platební služby PayPal.
GNU Octave lze nově používat ve webovém prohlížeči v JupyterLite s jádrem Xeus-Octave.
Od 3. do 16. listopadu proběhnou Dny AI 2025. V úterý 11. listopadu proběhne Open source AI day v Red Hatu v Brně.
Nová čísla časopisů od nakladatelství Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 158 (pdf) a Hello World 28 (pdf).
Vývojáři GIMPu nově vydávají oficiální snap balíčky GIMPu. Jsou sestavovány přímo v jejich CI (Continuous Integration) systému.
Správce sbírky fotografií digiKam byl vydán ve verzi 8.8.0. Jedná se o převážně opravné vydání provázené aktualizacemi knihoven. Novinky zahrnují implicitní použití systémového barevného profilu monitoru, import/export hierarchie štítků, editační nástroj rozostření aj.
Steve Jobs a superpočítač Cray-1 budou vyobrazeny na pamětních jednodolarových mincích vyražených v příštím roce v rámci série Americká inovace. Série má 57 mincí, tj. 57 inovací. Poslední 4 mince budou vyraženy v roce 2032.
jedna dva tři čtyři pět šest sedm osm devět desetVýsledek je smazání řádky tři a sedm a ke každé též jedné prázdné řádky, aby vzniklo:
jedna dva čtyři pět šest osm devět deset
Řešení dotazu:
cat soubor.txt | paste -sd# | sed 's/##[[:alnum:]]*##/@/g;s/@/\n\n/g;s/#/\n/g'Jestli se v tom tvojem textu vyskytujou křížky nebo závináče, budeš muset místo nich zvolit jinačí znaky.
paste -sd# | sed 's/##[[:alnum:]]*##/\n\n/g;s/#/\n/g'Nějak mi to nemyslí.
Tak se podívejme, jestli by to stačilo:
sed '/^$/ { N;N; /^\n.\+\n$/ s@.*@@ }' \ <<< $'\n\na\n\nb\n\nc\nd\n\ne\n\n\nf\n\ng\n\n\nh\n\ni\nj\nk\n\nl'
Očekávání:
c d i j k
Tvrdá realita:
a c d g h i j k l
Tyhle domácí úkoly obvykle vyžadují pár triků — právě proto, aby se nedaly tak snadno „vyřešit“ na ABCLinuxu.
find DIR -not -empty -type f -printf "%s\t%f%-260s\t%p\n" | sort -k 1,2 -t$'\t' | uniq -w260 -D | cut -f 3 -d $'\t' | xargs md5sum | sort | uniq -w32 --all-repeated=separate | cut -c 34-
(echo; echo; cat data.txt; echo;echo ) | paste --serial --delimiters=\# | sed 's/##\+\([^#]\+##\+\)\+/##/g;s/^##\+//;s/##\+$//;s/#/\n/g' c d i j k
Jo, mým testem to prochází v pohodě.
Tohle je návod, jak to vyřešit, nikoliv řešení. Existuje na to one-liner, to je jisté; on se tu hned vynoří někdo s Perlem.
Já bych to udělal megatěžkopádně, s pořádnými testy. Tady je totiž hned několik zajímavých situací, které je potřeba napřed přesně dodefinovat a poté správně ošetřit, například:
Nuže, pojďme vymyslet testovací nástroj, říkejme mu test.sh
, který bude chrlit vstupy se všemi možnými podrazy. Je sice jednoduchý, ale při dostatečně velkém počtu vstupů nakonec vygeneruje všechny výše zmíněné patologické případy, protože taky umí „náhodně“ generovat bloky řádků o velikostech 0 a 1, z nichž některé skončí na začátku a konci souboru, některé možná hned po sobě atp.
#!/bin/bash set -euo pipefail if (($# < 1)); then echo 'Expected arguments.' 1>&2; exit 11; fi print_input() { local -ir random="$1" blocks=10 limit=2 range='limit + 2' local -i j k r local nl= RANDOM=random for ((j = 0; j < blocks; ++j)); do ((r = RANDOM % range)) || : ((r < limit)) && line='unwanted' || line='wanted' printf "$nl" for ((k = 0; k < r; ++k)); do printf '%s %u/%u/%u\n' "$line" "$i" "$j" "$k" done nl=$'\n' done } RANDOM=0 || : declare -ir files=1000 declare -i i random for ((i = 0; i < files; ++i)); do printf '%s%s%s%s%s%s%s%s\n' '=========='{,,,,,,,} random=RANDOM diff -y --color <(print_input "$random") <(print_input "$random" | "$@") || : printf '%s%s%s%s%s%s%s%s\n' '=========='{,,,,,,,} done
Napřed pojďme otestovat test.sh
. Zkusíme tam dát kočku. Tady očekáváme výsledek bez rozdílů, tedy diff -y
neukáže žádné šipky a pravá (DSSS) i levá (KSČM) strana diff
ů bude stejná. Tím se také potvrdí (dobře, ne tak úplně), že celý trik s pseudonáhodnými čísly a se stabilními (tedy na prostěradle zaschlými) náhodnými semeny funguje. Tedy, pravděpodobně!
./test.sh cat
Další krok bude, že si teď místo kočky vytvoříme skutečnou implementaci toho algořiťmu. Říkejme mu třeba window.awk
. Má v sobě malou optimalizaci, která hlídá, aby se nikdy nedrželo v paměti víc řádků, než je nezbytné, ale jinak je to obyčejný, tupý stavový automat:
#!/usr/bin/awk -f function finalize_block(i) { if (length(block_window) >= MIN_BLOCK_LENGTH) { if (newline_due) print "" newline_due = 1 for (i = begin; i < end; ++i) print block_window[i] } delete block_window begin = end = 0 } BEGIN { MIN_BLOCK_LENGTH = 2 delete block_window[0] begin = end = 0 } !$0 { finalize_block() next } { block_window[end++] = $0 } length(block_window) > MIN_BLOCK_LENGTH { if (newline_due) print "" newline_due = 0 print block_window[begin] delete block_window[begin++] } END { finalize_block() }
Když to splácáme všechno dohromady, bude to dokonce i fungovat:
./test.sh ./window.awk
Výsledné diff
y ukazují, že to skutečně požírá unwanted
řádky, že to mezi bloky wanted
řádků nechává vždy právě jeden prázdný řádek, ať už prázdných řádků a příliš krátkých bloků mezi nimi bylo, kolik chtělo, že to netrousí prázdné řádky na začátku a konci výstupu, atd.
Leč když to aplikujeme na jedno níže uvedené řešení, tak … ejhle, je to rozbité:
./test.sh sed '/^$/ { N;N; /^\n.\+\n$/ s@.*@@ }'
perl -00nE 'print if split("\n", $_) >= 2'Jen pro pořádek tady je ten Perl.
perl -F'\n' -00E 'print if @F >= 2'
cat fredy72.txt | awk 'BEGIN{RS=""}{if(split($0,a,"\n")>=2)print $0"\n"}'
To ale vyžaduje, aby se vešel celý blok (mezi osamocenými řádky) do paměti. Za to by zápočet nebyl. Ale je to cool, to bezesporu.
(Kromě toho to není správně; trousí to prázdné řádky na konci.)
awk 'BEGIN { RS = "" } split($0, a, "\n") >= 2 { print p "\n" p = $0 } END { if (p) print p }'
Tahle↑ verze by vyřešila ty extra řádky, ale celý blok v paměti mi nepřijde jako výhra.
ale celý blok v paměti mi nepřijde jako výhra
RS = "\n\n"
, není řešením?
možná něco jako
awk 'BEGIN{RS="\n\n";FS="\n";ORS="\n\n"}{if($2)print $0}'ale AWK víceméně nepoužívám, takže jen odhaduji.
FS = "\n"
→ zase celý blok v paměti. Když budu mít blok o velikosti 100 TB, než přijde první "\n\n"
, tak to na většině mašin nedám.
wanted wanted unwanted wanted wanted(Off-topic: „
{if($2)print $0}
“ se řekne prostě $2
.)
"To ale vyžaduje, aby se vešel celý blok (mezi osamocenými řádky) do paměti."K tomu ma inspiroval ten perl on-liner hore, kde je pouzita command line option:
-00Ta option, alebo nastavenie premennej v skripte
$/ = ""sposobi, ze perl bude pracovat v tzv. paragraph mode, t.j. po blokoch.
Tiskni
Sdílej: