Shell Prakticky
Textové transformace příkazem sed

Lukáš Bařinka

Cíl

Cílem je vyzkoušet si textové úpravy pomocí filtru sed

Obsah

  • Jednoduché transformace pomocí příkazu sed
  • Složitější transformace pomocí příkazu sed

Část 1

Jednoduché transformace pomocí příkazu sed

Úloha 01

Vytvořte proměnnou ALPHA, která obsahuje jednotlivé řádky s písmeny AZ.


							~ALPHA=$( printf '%s\n' {A..Z} )

							~printf -v ALPHA '%s\n' {A..Z}
							~ALPHA=${ALPHA%?}
						

Úloha 02

Pomocí proměnné RANDOM vypište náhodné číslo od 1 do počtu řádek proměnné ALPHA .


							~echo $(( RANDOM % $( wc -l <<< "$ALPHA" ) + 1 ))
						

Úloha 03

Náhodné číslo z předchozího příkladu uložte do proměnné R .


							~(( R = RANDOM % $( wc -l <<<" $ALPHA" ) + 1 ))
						

Úloha 04

Vypište z proměnné ALPHA náhodné písmeno (řádek).


							~sed -n "${R}p" <<< "$ALPHA"
						

Úloha 05

Vypište řádky z proměnné ALPHA v náhodném pořadí.


							~shuf <<< "$ALPHA"

							~sort -R <<< "$ALPHA"
						

Úloha 06

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'
						

Úloha 07

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
						

Úloha 08

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
						

Úloha 09

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
						

Úloha 10

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
						

Část 2

Složitější transformace pomocí příkazu sed

Úloha 11

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
						

Úloha 12

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
						

Úloha 13

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'
						

Úloha 14

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
						

Úloha 15

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
						

Úloha 16

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
								}
							}'
						

Úloha 17

Vypište hodnoty proměnných z předchozí úlohy, pokud je taková proměnná deklarovaná.


							~declare -p $( !! ) 2>/dev/null