неделя, 11 февруари 2007 г.

Linux команди 2 (уж)

   Често, когато се налага да пиша html страници, в крайна сметка се оказва, че съм забравил да напиша нещо важно. Да укажа енкодинга, пътя до css файла или нещо друго. Когато това се случи и се налага едно и също нещо да бъде дописано в голям брой файлове става много неприятно. Самата идея, че трябва да отворя 50 или 100 файла, и във всеки да добавя едни ред изобщо не ме радва. В един от тези случаи седнах и потърсих решение на проблема, което да ми спести време и работа. За да е ясен примера първо ще обясня самата идея. Използвам sed - (stream editor). Например:
echo "ab ac ad ae"|sed 's/a/1/g'
Резултатът от тази команда е:
1b 1c 1d 1e. Какво се случва? Изпращаме стринга ab ac ad ae към sed, на който сме казал да замени (с опцията "s") символа "а" с единица "1". Последната буква "g" означава "general" - да замени всички намерени а-та с 1-ца. Ако свместо "g" имаме "2" ще бъде заменено само второто намерено "а" с "1". Написана на български командата ще изглежда така:
кажи "ab ac ad ae" на sed 'заменя/търсено/с_ново/всички'
   Сега обратно към скрипта. За да е разбираемо приемаме, че сме забравили да напишем думата "tralala" в края на всеки файл. Ето скрипта, после и обяснението:

#!/bin/bash
for FILE in `find ./ -iname "*.html"`; do
sed 's/
<\/html>/tralala<\/html>/g' > $FILE.new
mv $FILE.new $FILE
done


   Зеленият текст е това което търсим, а синият е това, с което ще заменим търсеното. "\" пред "/" на </html> не позволяват на sed да ги приеме като част от командата и го кара да ги третира като обикновен текст.

   За всеки ред от скрипта по отделно:
» Чрез find присвояваме на променливата FILE всички файлове с разширение html в текущата директория и поддиректориите и. Използваме цикъла for-do-done, за да "обработим" всички файлове.
» sed прочита файловете и заменя търсеното с новото, след което записва новия файл с същото име като източника, но завършващо на new (писането в отделен файл се налага при работа с по-големи файлове).
» Преименуваме новосъздадения файл, като го кръщаваме както се е казвал файла, от който е създаден.
» Done!

Няма коментари:

Публикуване на коментар