# Úvod do UNIXu (SWI095x1h), 6. cvičení, 2005-03-30
# SU1, Malá Strana, MFF UK
#
# Řešení jsou odladěná na FreeBSD 4.11-RELEASE, konkrétní příklady
# na zpracování /etc/passwd se týkají stroje mail.kolej.
#
# $DevNullCZ: cviceni-06.reseni.txt,v 1.2 2005/04/01 08:43:48 jp Exp $
#

#---------------------------------------------------------------------
# sed
#
# sed = Stream  EDitor
#---------------------------------------------------------------------

(s1) v souboru /etc/passwd nahraďte řetězec "bash" za "BASH"

## sed -e 's/bash/BASH/' /etc/passwd

(s2) na konec každého řádku přidejte znak '+'

## sed -e 's/$/+/' /etc/passwd

(s3) spočtěte dohromady všechna UID v souboru /etc/passwd. Výsledek
dnes (2005-03-30) odpoledne byl 5888793.

Hint: echo '1 + 1 + 1' | bc
Hint: tr '\n' '+'

## grep -v ^# /etc/passwd | cut -f3 -d: | tr '\n' '+' | sed -e 's/$/0/g' | bc

(s3b) napište příkaz, který v aktuálním podstromu nahradí všechny
výskyty řetězce "int" za "long" v C-čkových souborech (tj. v
souborech končících na ".c")

Hint: find, sed -i

## find . -name '*.c' -exec sed -i "" -e 's/int/long/g' {} \;
##
## vložit prázdný string za '-i' je nutné, jinak se vytvoří záložní
## soubor s koncovkou "-e".

(s4) vymažte všechny řádky obsahující řetězec "bash"

## sed -e '/bash/d' /etc/passwd 

(s5) nalezněte jiný způsob řešení příkladu (s4), s použitím option
"-n" sedu.

Hint: najděte si v manu "!"

## sed -ne '/bash/!p' /etc/passwd 

(s6) vymažte prázdné řádky

## sed '/^$/d' /etc/passwd 

(s7) před každý řádek (tj. na samostatný řádek) vypište jeho
pořadové číslo

Hint: "="

## sed -e '=' /etc/passwd

(s8) pomocí sedu a ničeho jiného spočti lajny souboru /etc/passwd

Hint: potlač výpis samotných řádků a pro poslední řádek vypiš jeho
pořadové číslo

## sed -n '$=' /etc/passwd

(s9) vypište poslední řádku

Hint: vyberte poslední řádku, všechny ostatní nevybrané řádky
smažte, opět viz "!"

## sed '$!d' /etc/passwd

(s10) chytejte řádky obsahující řetězec "nologin" do hold space a
ten vypište v případě, že narazíte na řetězec "tcsh". Nic jiného než
hold space nechci vypisovat.

Hint: sed funkce "H" a "g"

## sed -e '/nologin/H; /tcsh/!d; /tcsh/g' /etc/passwd

(s11) vypište řádky obsahující "tcsh" tak jak na ně narazíte a
sbírejte řádky obsahující "nologin"; a na konci tyto nologin řádky
vypište

## sed -ne '/tcsh/p; /nologin/H; $g; $p' /etc/passwd

(s12) očíslujte řádky /etc/passwd tak, že za číslem bude :, pak
tabelátor a poté původní řádek

Hint: "N", dvojnásobné použití sedu

## sed = /etc/passwd | sed 'N;s/^\([0-9]*\)/\1:/;s/\n/     /'

(s13) obraťte soubor /etc/passwd, tj. poslední rádek bude první,
předposlední druhý atd.

Hint: "G"; v každém kroku vložte za aktuální řádek obsah hold space
a výsledný pattern space uložte do hold space. Pro poslední řádek
pak hold space vložte do pattern space a vypište.

## sed '1!G;h;$!d;h' /etc/passwd

## Další užitečné věci se sedem (,,sed oneliners'') viz třeba zde:
##
## http://www.student.northpark.edu/pemente/sed/sed1line.txt

#---------------------------------------------------------------------
# vi, ViM 
#
# vi = visual editor
# ViM = Vi IMproved (www.vim.org), včetně verze pro Win
#---------------------------------------------------------------------

(v1) to samé jako (g3), ale původní řešení uložte do souboru,
soubor otevřete v editoru "vim" (rozšíření klasického editoru vi) a
změnte zadání tak, že budete sčítat GID čísla. Použijte pak "-f"
option u příkazu sed.

# Vi je základní editor ve všech unix-like systémech a jeho hodně
# decentně řečeno rozšíření ViM považuju za nejlepší
# (programátorský) editor. Dostal již mnoho ocenění jako nejlepší
# Open Source editor.  Základní informace o něm viz:
#
# http://www.vim.org/6k/features.en.txt
#
# Krátký ViM tutoriál se spustí přímo na mail.kolej příkazem
# "vimtutor". Doporučuju.