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