Cílem je vyzkoušet si textové úpravy pomocí filtru sed
Jednoduché transformace pomocí příkazu sed
Vytvořte proměnnou ALPHA
, která obsahuje jednotlivé řádky s písmeny A
až Z
.
~ALPHA=$( printf '%s\n' {A..Z} )
~printf -v ALPHA '%s\n' {A..Z}
~ALPHA=${ALPHA%?}
Pomocí proměnné RANDOM
vypište náhodné číslo od 1
do počtu řádek proměnné ALPHA
.
~echo $(( RANDOM % $( wc -l <<< "$ALPHA" ) + 1 ))
Náhodné číslo z předchozího příkladu uložte do proměnné R
.
~(( R = RANDOM % $( wc -l <<<" $ALPHA" ) + 1 ))
Vypište z proměnné ALPHA
náhodné písmeno (řádek).
~sed -n "${R}p" <<< "$ALPHA"
Vypište řádky z proměnné ALPHA
v náhodném pořadí.
~shuf <<< "$ALPHA"
~sort -R <<< "$ALPHA"
Vypište náhodný řetězec náhodné délky (max. 10 znaků) tak, aby se žádné písmeno neopakovalo.
~shuf <<< "$ALPHA" | sed $(( RANDOM%10 + 1 ))q | tr -d '\n'
Z manuálové stránky příkazu bash
vypište obsažená písmena seřazená podle jejich četnosti do souboru freq1
.
~man bash | tr -dc '[:alpha:]' | sed 's/./&\n/g' \
| sort | uniq -c | sort -n | grep -o .$ > freq1
~man bash | tr -dc '[:alpha:]' | sed 's/./&\n/g' \
| sort | uniq -c | sort -n | sed 's/.*\(.\)/\1/' > freq1
Pomocí náhodné posloupnosti znaků z 5. úlohy nahraďte znaky v textu manuálové stránky příkazu bash
a uložte do souboru coded
.
~FROM=$( tr -d '\n' < freq1 )
~TO=$( shuf < freq1 | tr -d '\n' )
~man bash | tr "$FROM" "$TO" > coded
Ze souboru coded
vypište obsažená písmena seřazená podle jejich četnosti do souboru freq2
.
Stejně jako v 7. úloze.
~tr -dc '[:alpha:]' < coded | sed 's/./&\n/g' \
| sort | uniq -c | sort -n | grep -o .$ > freq2
~tr -dc '[:alpha:]' < coded | sed 's/./&\n/g' \
| sort | uniq -c | sort -n | sed 's/.*\(.\)/\1/' > freq2
V souboru coded
nahraďte znaky ze souboru freq2
za znaky ze souboru freq1
.
~tr "$( tr -d '\n' < freq2 )" "$( tr -d '\n' < freq1 )" < coded
~tr "$( cat freq2 )" "$( cat freq1 )" < coded
~tr "$( < freq2 )" "$( < freq1 )" < coded
Složitější transformace pomocí příkazu sed
Ze souboru /etc/ssh/sshd_config
odstraňte komentáře (cokoliv za #
) a vypište pouze neprázdné řádky a v nich nahraďte posloupnost mezer za tabulátor.
~sed '
s/#.*//
/^[[:space:]]*$/ d
s/ */\t/g
' /etc/ssh/sshd_config
Z manuálové stránky příkazu grep
vypište unikátní odkazy na manuálové stránky seřazené podle čísla sekce.
Formát odkazu je: název(sekce)
, kde v názvu předpokládejte písmena a v označení sekce předpokládejte číslo.
~man grep | grep -o '\<[[:alpha:]]\+([0-9])' \
| sort -t'(' -k2,2 -k1,1 -u
~man grep | sed 's/)/)\n/g' \
| sed -n 's/.*\(\<[[:alpha:]]\+([0-9])\).*/\1/p' \
| sort -t'(' -k2,2 -k1,1 -u
Z manuálové stránky příkazu bash
vypište názvy částí (psány velkými písmeny na začátku řádky).
~man bash | grep '^[[:upper:]][[:upper:] ]*$'
~man bash | sed -n '/^[[:upper:]][[:upper:] ]*$/ p'
Vytvořte skript also
, který pro zadaný příkaz (název manuálové stránky) vypíše část SEE ALSO
z této manuálové stránky.
Vypište část SEE ALSO
pro příkaz bash
a grep
.
#!/bin/bash
man "$1" | sed -n '/^SEE ALSO/,/^[[:upper:]]/ p' | sed '$ d'
~chmod +x also
~./also bash
~./also grep
Vytvořte skript opts
, který pro zadaný příkaz (název manuálové stránky) vypíše seznam přepínačů (bez popisu) z této manuálové stránky.
Vypište přepínače příkazů ls
, man
a grep
.
#!/bin/bash
man "$1" | sed -n '
/^[[:space:]]\+-/ {
s/^[[:space:]]*//
s/ .*//
p
}'
~chmod +x opts; ./opts ls; ./opts man; ./opts grep
Z manuálové stránky příkazu bash
vypište seznam proměnných.
Vypište řádky od Shell Variables
po Arrays
, vezměte pouze řádky, které mají na začátku právě 7 mezer a zahoďte řádky s textem The
na "začátku". Výsledek upravte.
~man bash | sed -n '
/^ *Shell Variables/,/^ *Arrays/ {
/^ \{7\}[^ ]/ {
s/^ *//
/^The/ d
s/ .*//
p
}
}'
Vypište hodnoty proměnných z předchozí úlohy, pokud je taková proměnná deklarovaná.
~declare -p $( !! ) 2>/dev/null