<pre class="code-block">
... | awk '{printf $1" "}' | ...
</pre>
+ <h3 id="18.6.3.sed">18.6.3. sed</h3>
+ <p>
+ <strong>Sed</strong>, czyli edytor strumienia
+ (ang. <em><strong>s<strong>tream <strong>ed</strong>itor</em>), jest
+ nieinteraktywnym edytorem tekstu opierającym się na wydawaniu
+ pojedynczych poleceń. Za jego pomocą możemy wstawiać do plików
+ poszczególne linie lub je zmieniać stosując znaną metodę
+ <em>find and replace</em>. Sed działa zarówno na plikach jak i
+ strumieniu danych wejściowych.
+ </p>
+ <p>
+ W plikach może zajść taka potrzeba aby zmienić pewien zapis tylko
+ w jedenej linii, to wskazanie tej wybranej linii może odbyć się na
+ dwa sposoby: za pomocą wyrażenia regularnego lub podając konkretny
+ numer linii. Wyrażenie regularne sprawdzi sie przy kilku liniach, w
+ przypadku jednej konkretnej, wystarczy podać jej numer.
+ </p>
+ <p>
+ Przy początkach naszej pracy ze skryptami, najczęściej będziemy
+ wykorzystywać raczej opcje <em>find and replace</em>, nie mniej
+ jednak specyficzna składania polecenia <em>sed</em> wymaga aby
+ chociażby pokazać jak wyglądają polecenia <em>insert</em>,
+ <em>append</em> czy <em>print</em>.
+ </p>
+ <h4>Polecenie sed - <em>insert</em></h4>
+ <p>
+ Polecenie <em>insert</em> wstawia podaną wartość w konkretną linię
+ podaną przez wyrażenie regularne lub numer linii.
+ </p>
+<pre class="code-block">
+$ sed '21i Lorem ipsum dolor sit amet, consectetur adipiscing elit' plik.txt
+</pre>
+ <p>
+ Na powyższym przykładzie <code class="code-inline">i</code> oznacza
+ właśnie polecenie <em>insert</em>. Przed poleceniem znajduje się
+ numer linii, który w przypadku narzędzia <em>sed</em> pisany jest
+ łącznie wraz ze wskazniem konkretnego polecenia. Po poleceniu
+ występuje wartość, która ma zostać zapisana w pliku.
+ </p>
+ <p>
+ Polecenie to domyślnie zwrócić na standardowe wyjście całą zawartość
+ pliku z podmienioną linią, ponieważ jest to edytor strumienia to
+ musi on otwrzyć plik i działać na nim w pamięci. Aby nasze zamiany
+ faktycznie miały jakiś skutek musimu dodać opcję <em>-i</em>.
+ </p>
+ <p>
+ Podobnie jest poleceniem <em>append</em> - <strong>a</strong>,
+ również wymaga ono opcji <em>-i</em>. Składania tego polecenia
+ jest podobna nie mniej jednak zasada działania jest trochę inna.
+ Otóż to polecenie dopisze pod wskazaną linią, podaną wartość. W
+ przypadku naszego przykładu, podana wartość znalazła by się w 22
+ linii.
+ </p>
+ <h4>Polecenie sed - print</h4>
+ <p>
+ Za polecenie <em>print</em> odpowiedzialna jest litera <strong>p</strong>
+ nie ma w tym nic dziwnego, nie mniej jednak warto zaznaczyć, że
+ polecenie to przyjmuje zakres linii do wyświetlania np. jesli
+ chcemy wyświetlić linie od 1 do 12, to wówczas możemy skorzystać z
+ poniższego polecenia:
+ </p>
+<pre class="code-inline">
+$ sed '1,12p' test.txt
+</pre>
+ <p>
+ Tutaj istotną role pełni cytowanie. Jeśli checielibyśmy wyświetlić
+ linie od 100 do końca pliku, to polecenie <em>sed</em> mogło by
+ wyglądac w ten sposób: <code class="code-inline">'100,$p'</code>.
+ No dobrze, a jeśli początek zakresu jest zapisany w zmiennej to
+ polecenie powinno wyglądać mniej więcej tak
+ <code class="code-inline">"$a,$p"</code>. Problem w tym, że dolna
+ granica zakresu, rownież zostanie zinterpretowana jako zmienna. W tej
+ sytuacji należy zacytować sam znak dolara.
+ </p>
+<pre class="code-inline">
+$ sed "$a,\$p" test.txt
+</pre>
+ <p>
+ Natomiast jeśli w zmiennej znajduje się dolna granica ciągu, to aby
+ oddzielić odwołanie się do zmienne od polecenia <em>print</em> należy
+ użyć funkcji powłoki BASH, jaką jest wyrażenie parametru.
+ </p>
+<pre class="code-inline">
+$ sed "1,${a}p" test.txt
+</pre>
+ <h4>Polecenie sed - find and replace</h4>
+ <p>
+ Do funkcji programu <em>sed</em>, <em>find and replace</em>
+ przypisana jest litera <strong>s</strong>. Domyślna składnia jest
+ następująca:
+ </p>
+<pre class="code-inline">
+$ sed "s/ala/ola/" test.txt
+</pre>
+ <p>
+ Po polecenie <code class="code-inline">s</code> występuje separator,
+ następnie wartość poszukiwana, znów separator oraz nowa wartość,
+ która zastąpi wartość poszukiwania, na końcu polecenia znów występuje
+ separator. Polecenie zamieni pierwsze wystąpienie ciągu
+ <code class="code-inline">ala</code> na ciąg
+ <code class="code-inline">ola</code>.
+ </p>
+ <p>
+ W przypadku tego polecenia <em>sed</em> jest bardzo elastyczny.
+ Ponieważ równie dobrze jako separator możemy użyć innych znaków.
+ Znak ukośnika (<strong>/</strong>) wykorzystywany jest w ścieżkach,
+ a one są jednymi z częściej zmienianych elementów konfiguracyjnych
+ w Uniksach. Jako separatora możemy użyć zarówno: małpy
+ (<strong>@</strong>) jak i przecinka (<strong>,</strong>).
+ </p>
+ <p>
+ Ostatni separator nie musi kończyć polecenia. Ponim zaś występują
+ modyfikatory. Jednym z takich modyfikatorów jest <strong>g</strong>.
+ Ten modyfikator powoduje, że wszystkie znalezione występienia
+ szukanej frazy zostaną zastąpione.
+ </p>
+ <p>
+ Podobnie polecenie <code class="code-inline">s</code> nie musi
+ rozpoczynać polecenia. Polecenie <em>s</em> zarówno jak
+ <em>i</em> czy <em>a</em> może zostać sprecyzowane do konkretnej
+ linii lub grupy elementów pasujących do wyrażenia regularnego.
+ </p>
+ <h3 id="18.6.4.wc">18.6.4. wc</h3>
+ <p>
+ Polecenie <strong>wc</strong>
+ (ang. <em><strong>w</strong>ord <strong>c</strong>ount</em>), jest
+ poleceniem, które zadaniem jest liczenie linii, znaków czy też słów,
+ podanych za pomocą pliku czy też ze strumienia standardowego wejścia.
+ Wykorzystanie polecenia <em>wc</em>, może być całkiem przydatne w
+ momencie gdy musimy ustalić np. granicę dla pętli <em>while</em>.
+ Najczęsciej stoswane jest liczenie linii
+ (za pomoca opcji <em>-l</em>), czasami może się przydać liczenie
+ znaków (za pomocą opcji <em>-c</em>) oraz słów
+ (za pomocą opcji <em>-w</em>).
+ </p>
+ <h2 id="18.7.summary">18.7. Podsumowanie</h2>
+ <p>
+ W tym rozdziale poznaliśmy podstawy tworzenia skryptów powłoki, które
+ pomogą nam automatyzować zadania wykonywana w powłoce. Nie piszę
+ tutaj, konkretnych nazw. Ponieważ jeśli zagłebimy się w temat, to
+ BASH zebrał najlepsze funkcje oraz rozwiązania z innych powłok i
+ zaimplementował u siebie. Oczywiście sam BASH nie jest nowym
+ rozwiązaniem, ponieważ powstał już 1987 roku. Innymi stosowanymi
+ rozwiązaniami są takie powłoki jak <em>zsh</em> czy <em>fish</em>.
+ Inny ciekawy rozwiązaniem jest projekt <em>nu shell</em>,
+ przestawiający troche inne podejście. Zachęcam do zapoznania się
+ z projektem. Jeśli jednak twardo będziemy obstawać, przy BASH-u
+ (ma to swoje zalety, większość dystrybucji wykorzystuje jednak BASH,
+ więc lepiej mieć to samo środowisko w domu jak i na serwerze w
+ pracy). To można zapoznać się z dodatkowymi materiałami:
+ </p>
+ <ul>
+ <li><a href="https://morketsmerke.github.io/articles/terminallog/BASH_bushido.html">Wiele przydatnych sztuczek w BASH-u</a></li>
+ <li><a href="https://tldp.org/LDP/Bash-Beginners-Guide/html/index.html">Podręcznik do powłoki BASH dla początkujących.</a></li>
+ <li><a href="https://https://tldp.org/LDP/abs/html/index.html">Podręcznik do zaawansowanych skryptów BASH-u.</a></li>
+ </ul>
</div>
<p style="margin: 15px; padding: 0; outline: 0;">
2024; COPYLEFT; ALL RIGHTS REVERSED;