Multiplatformní multimediální knihovna SDL (Simple DirectMedia Layer) byla oficiálně vydána v nové major verzi 3 (3.2.0). Změny jsou popsány v README pro migraci aplikací z SDL 2 na SDL 3.
Wine bylo po roce vývoje od vydání verze 9.0 vydáno v nové stabilní verzi 10.0. Přehled novinek na GitLabu. Vypíchnuta je nová architektura ARM64EC a podpora High DPI škálování.
Edvard Rejthar na blogu zaměstnanců CZ.NIC představil nástroj deduplidog pro odstranění duplicitních souborů.
Společnost DeepSeek představila (𝕏) AI model DeepSeek-R1 (Hugging Face) srovnatelný s OpenAI o1 a uvolnila jej pod open source licencí MIT, tj. zdarma i pro komerční použití.
GKrellM (GNU Krell Monitors, Wikipedie), tj. grafická aplikace pro sledování systémů a různých událostí, byla po pěti a půl letech vydána v nové verzi 2.4.0. Přehled novinek na Gitea.
Americká první dáma Melania Trumpová vydala v předvečer manželovy inaugurace vlastní kryptoměnu. Jmenuje se $Melania. Donald Trump vydal vlastní kryptoměnu $Trump den před manželkou.
GNU Project Debugger aneb GDB byl vydán ve verzi 16.1. Podrobný přehled novinek v souboru NEWS.
Po 9 týdnech vývoje od vydání Linuxu 6.12 oznámil Linus Torvalds vydání Linuxu 6.13. Přehled novinek a vylepšení na LWN.net: první a druhá polovina začleňovacího okna a Linux Kernel Newbies. Odstraněn byl souborový systém ReiserFS.
19. ledna 2038 přeteče hodnota time_t na 32bitových systémech, na vyřešení problému roku 2038 (Y2K38) tedy zbývá 13 let. Např. Debian v uplynulém roce přešel na 64bitový čas. Bernhard Wiedemann z openSUSE sdílí chyby v sestavení rozšířeného softwaru.
Byla vydána druhá opravná verze 21.2 v dubnu loňského roku vydané verze 21 multimediálního centra Kodi (dříve XBMC, Wikipedie) s kódovým označením Omega.
Umožňují předat vstup příkazu ze samotného skriptu. Ukážeme si to na skriptu here.sh
.
#!/bin/bash
|
Ještě si skript spustíme.
# ./here.sh
$USER=root
|
Lze je použít k neúplnému zadání jména souboru.
POZOR neztotožňujte metaznaky shellu s regulárními výrazy, jsou to dvě různé věci. Metaznaky expanduje přímo shell. A proto když chceme nějakému programu předat regulární výraz, musíme ho uzavřít například do apostrofů.
*
- libovolný řetězec (může být i nulové délky)?
- libovolný jeden znak~
- domovský adresář ($HOME)~UJ
- domovský adresář uživatele UJ~+
- aktuální pracovní adresář ($PWD)~-
- předchozí pracovní adresář ($OLDPWD)[abc...]
- jakýkoliv znak uvedený v [], lze použít - k
zápisu intervalu znaků např a-z, 0-9[!abc...]
- opak předchozího (tj. jakýkoliv znak mimo
uvedených znaků v [])První příkaz smaže zálohy souborů (soubory končící na ~
).
Znak ~
nebude v tomto případě expandován.
$ rm *~
|
Jsou (mými slovy, přesná definice je "trochu" složitější )
vzory, s jejichž pomocí lze definovat společné rysy několika různých
řádků a tím pádem je reprezentovat jako jeden regulární výraz.
Níže uvedené speciální znaky jsou použitelné např. v grep
,
egrep
, sed
, ed
, ex
,
awk
.
.
- jakýkoliv znak (mimo znaku nového řádku)*
- libovolný počet (i nulový) opakování předchozího
znaku (lze použít i regulární výraz)^
- následující výraz musí odpovídat začátku řádku$
- předchozí výraz musí odpovídat konci řádku\
- vypíná speciální význam následujícího znaku[]
- jakýkoliv znak uvedený v hranatých závorkách,
speciální znaky zde mají normální význam, mimo
-
tu lze použít pro zápis intervalů
(a-z atd.) a znak ^
uvedený jako
první způsobí negaci (tj. jakýkoliv znak
neuvedený v ...)Použijeme programy cat
, grep
a všechno
si poctivě vyzkoušíme.
$ cat << END > ./retezce.txt > abclinuxu > alfa > aaa > abcabcabc > znak $ > a1a > aAa > END $ cat ./retezce.txt | grep '.*' abclinuxu alfa aaa abcabcabc znak $ a1a aAa $ cat ./retezce.txt | grep '.* \$' znak $ $ cat ./retezce.txt | grep '^a[a-z]*a$' alfa aaa $ cat ./retezce.txt | grep '^a[a-z0-9]*a$' alfa aaa a1a |
Jsou programy, které ze vstupu podle zadaného vzoru odfiltrují
jen námi požadovaná data a pošlou je na výstup. Jsou jimi např.
grep
, egrep
(grep -E
) a
fgrep
(grep -F
), jsou to vlastně stejné
programy. Pro nás je důležité, že grep
používá pro
zápis regulárních výrazů starší notaci a egrep
naopak
novější notaci. Níže uvedené speciální znaky patří do novější notace
a chceme-li je použít ve filtru grep
, musíme před ně
zapsat znak \
.
+
- jeden a více výskytů předchozího výrazu.?
- jeden nebo žádný výskyt předchozího výrazu.|
- předcházející nebo následující výraz.()
- text odpovídající výrazu mezi závorkami se
uloží do paměti a lze ho použít pomocí
\1
až \9
, čísluje se
od vnějších závorek směrem dovnitř
(např. ((abc)linuxu) \1
= "abclinuxu") a \2
= "abc". Nebo
lze použít závorky k definování priority
vyhodnocení.{n,m}
- interval opakování předchozího výrazu,
{n} - opakuje se n-krát, {n,} n-krát a více,
{n,m} n-krát až m-krátPro lepší pochopení uvedu opět několik příkladů.
$ cat ./retezce.txt | grep '^a\+$' aaa $ cat ./retezce.txt | egrep '^a+$' aaa $ cat ./retezce.txt | egrep '^abcl?' abclinuxu abcabcabc $ cat ./retezce.txt | egrep '^c|z' znak $ $ cat ./retezce.txt | egrep '(abc)+' abclinuxu abcabcabc $ cat ./retezce.txt | egrep '^(.*)\1\1$' aaa abcabcabc $ cat ./retezce.txt | egrep '^a{3}$' aaa $ cat ./retezce.txt | egrep '^a{2,}$' aaa $ cat ./retezce.txt | egrep '^a{1,3}$' aaa |
Z názvu je zřejmé, že slouží k proudové editaci dat. O načítání vstupu
se starají sami. Mají k dispozici sadu příkazů, pomocí které data upravují
(obvykle pracují s jedním řádkem), např. sed
a nebo na
složitější věci awk
.
Syntaxe příkazu:
Začátek,Konec!InstrukceArgumenty
Začátek
- číslo řádku ($ značí poslední řádek) nebo
/regulární výraz/Konec
- číslo řádku nebo /regulární výraz/!
- neguje předchozí bodyInstrukce
- mají jedno písmenoArgumenty
- k některým instrukcímNení-li uveden Začátek
a Konec
, aplikuje
se instrukce na každý vstupní řádek. Je-li uveden pouze
Začátek
, aplikuje se instrukce pouze na odpovídající řádek
(či řádky) a je-li uvedeno obojí, tak od řádku odpovídajícímu
Začátek
se budou aplikovat instrukce a od řádku
odpovídajícímu Konec
se aplikovat přestanou.
Níže jsou uvedeny některé Instrukce
a jejich
Argumenty
.
s/vzorek/náhrada/příznaky
- nahradí první nalezený
vzorek náhradou
. Příznaky
:
n
- nahradí n-tý výskyt vzorku
(1 až 512),
g
- nahradí všechny výskyty vzorku.w soubor
- do souboru uloží vstupní řádek (řádky)r soubor
- soubor načte do vstupup
- vypíše vstupní řádek na výstupn
- přesune se na další vstupní řádekd
- vstupní řádek je smazány/původní znaky/nové znaky/
- přeloží znaky
(man tr
):
- označí řádek skriptu pro odskok
Instrukcí t
nebo b
t
- byla-li provedena substituce, skočí na následující
značku :
, není-li uvedena, skočí
na konec skriptu{}
- zajistí aplikaci více příkazů na jednu adresu
$ cat ./retezce.txt | sed '2,$s/a/?/g' abclinuxu ?lf? ??? ?bc?bc?bc zn?k $ ?1? ?A? $ cat ./retezce.txt | sed -n '2p' alfa $ cat ./retezce.txt | sed -n '1{ > n > p > }' alfa $ cat ./retezce.txt | sed '2p > d' alfa $ cat ./retezce.txt | sed '4y/a/?/ > 4!d' ?bc?bc?bc |
Na závěr uvedu ještě jeden příklad ve formě skriptu
sed.sh
.
#!/bin/bash spojka="je bydliště" cat <<EOF | sed \ "s/^\(.\+j\) \(.\+\)o:\(.\+\)\$/\3 $s \1e \2a/ t s/^\(.\+j\) \(.\+\):\(.\+\)\$/\3 $s \1e \2a/ t s/^\(.\+\) \(.\+\)o:\(.\+\)\$/\3 $s \1a \2a/ t s/^\(.\+\) \(.\+\):\(.\+\)\$/\3 $s \1a \2a/" Petr Novák:Praha Viktor Igo:Brno Blažej Vodník:Plzeň Jan Hugo:Hradec Králové Metoděj Sporák:Ostrava EOF exit 0 |
Výstup skriptu vypadá následovně.
$ ./sed.sh Praha je bydliště Petra Nováka Brno je bydliště Viktora Iga Plzeň je bydliště Blažeje Vodníka Hradec Králové je bydliště Jana Huga Ostrava je bydliště Metoděje Sporáka |
V případě, že bychom chtěli zajistit správné skloňování úplně pro všechny jména a přijmení, určitě by výše uvedené řešení nebylo to nejkratší a nejvhodnější, berte ho pouze jako ukázku.
Nástroje: Tisk bez diskuse
Tiskni Sdílej:
Diskuse byla administrátory uzamčena
$ sed -n '1p' < ./soubor
První řádek
$ sed -n '$p' < ./soubor
Poslední řádek
$ sed -n '1!p' < ./soubor
Druhý řádek
Třetí řádek
Poslední řádek
Chce ještě někdo zodpovědět nějaký konkrétní příklad?
#!/bin/bash mv $1 $1.old sed 's/ahoj/nazdar/' $1.old > $1 #rm $1.old exit 0 $ find -type f | xargs -i ../skript.sh {}
$ cat soubor nazdarahojnazdarahojnazdarahojnazdar $ sed 's/ahoj/\n/g' < ./soubor nazdar nazdar nazdar nazdar $ sed 's/\(ahoj\)/\n\1\n/g' < ./soubor nazdar ahoj nazdar ahoj nazdar ahoj nazdar
$ cat soubor Řádek 1 Error 2 Řádek 3 Error 4 $ egrep -v '^Error.+$' < ./soubor Řádek 1 Řádek 3
Můžeš např. všechno kromě čísel a mezer smazat.
$ echo "1234 ahoj 4321" | sed -n 's/[^0-9 ]//gp' 1234 4321
Ale podle mě bude lepší zkontrolovat všechny argumenty a v případě, že uživatel v některém z nich zadá cokoliv jiného než číslo, zakřičí se na něj a program se ukončí.
for argument in $@; do if [ $(echo $argument | grep '[^0-9]' | wc -l) -ne 0 ]; then echo "Argument '$argument' není číslo!!!" exit 1 fi done
Rádi Ti pomůžeme, ale specifikuj prosím Tvůj problém jednoznačně, nejlepší bude když uvedeš konkrétní příklad, co máš a co z toho chceš dostat.
$ cat pocet_tagu.sh
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage: $0 file.xml"
exit
fi
echo -e "\n$1:"
tags_all=$(cat $1 |sed -n 's/[^>]*\(<[^ >]\+[ >]\)/\1\n/gp' |grep "^<[^\/]" |sort)
tags_uniq=$(echo $tags_all |sed 'y/ /\n/' |uniq)
for tag in $tags_uniq; do
count=$(echo $tags_all |sed 'y/ /\n/' |grep $tag |wc -l)
printf " %-20s %10i\n" $tag $count
done
$ find -type f -regex ".*\.xml" |xargs -i ./pocet_tagu.sh {}
./soubor02.xml:
<accelerator 2
<!DOCTYPE 1
<glade-interface> 1
<child> 236
<child 250
<packing> 206
<placeholder/> 2
<property 2521
<signal 36
<widget 258
<?xml 1
./soubor01.xml:
<kocka> 2
<pes> 2
<xml> 1
<zvire> 2
IFS="<"; set -- $(cat "$1"); for tag in "$@" ; do IFS=" >"; set -- $tag; echo "$1"; done | sort | uniq -c
IFS="<"; set -- $(cat "$1"); for tag in "$@" ; do echo "${tag%%[ >]*}"; done | sort | uniq -c
$ echo ~ /home/jozef $ echo a~ a~ $ echo a\ ~ a ~
$ ./configure --prefix=~/myprogs configure: error: expected an absolute directory name for --prefix: ~/myprogs $ ./configure --prefix=$HOME/myprogs checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes ... atd. (takhle mi to už funguje) ...P.S. Takhle kompiluju software pokud nechci spouštět
make install
jako root. Prostě jsem si do .bash_profile
přidal příkaz který přidal ~/myprogs/bin
do PATH
a můžu takhle zkompilovaný a nainstalovaný programy normálně spouštět jako kdyby byli kompilované instalované "normálním způsobem". Zatím mi všechny takhle kompilované a instalované programy fungovali bez problémů (mezi nimi jsou i takové fajnové vychytávky jako třeba mplayer
). Dělám to tak, protože jsem poněkud paranoidní co se týče poskytování ROOT
oprávnění neznámým skriptům a programům (čti: normální sysadmin).