Категории

пятница, 8 марта 2013 г.

Работа с текстом во FreeBSD dos2unix, unix2dos, удаление BOM в консоли.

Замена текста: Способ 1: Замена подстроки с помощью ПЕРЛ
perl -e 's/Pavel/Misha/g' -pi ./index.html
Способ 2: Замена с помощью sed
sed -e 's/Pavel/Misha/g'  ./index.html > index_new.html
Способ 3: Замена с помощью awk
awk '{gsub("Pavel","Misha",$0); print > FILENAME}' ./index.html
Полезные функции для работы с файлами:
dos2unix() {
 sed -i '' -e 's/'"$(printf '\015')"'$//g' "$2"
}

unix2dos() {
 sed -i '' -e 's|$|'"$(printf '\015')"'|g' "$2"
}

delete_BOM() {
# awk '{sub(/^\xEF\xBB\xBF/,"",$0); print > FILENAME}' "$1"
 awk '{sub(/^\xEF\xBB\xBF/,"",$0); print}' "$1" >> "${1}.awkbak"
 mv "${1}.awkbak" "$1"
}

#По 1 файлу
dos2unix -o russian.php
delete_BOM russian.php

# Найти и обработать все *.tpl и *.php файлы от текущего каталога.
for i in $(find . -type f \( -name '*.tpl' -o -name '*.php' \) -print); do
 echo 'Working: '$i'...'
 dos2unix -o $i
 delete_BOM $i
done
dos2unix -o для обратной совместимости с одноименной консольной утилитой /usr/ports/converters/unix2dos, но зачем засорять систему лишними пакетами, если можно обойтись встроенными средствами?

P.S. Если кто-то подскажет более изящное решение на awk, sed или еще чем-то, что идет штатно во FreeBSD для удаления BOM, буду только рад :) Варианты с perl не предлагать, они очевидны и не интересны :)
Первый вариант с awk почему-то не работает, часть файла теряется.
FreeBSD Подсказывает в motd вариант на sed:
sed -e '1s/^\xef\xbb\xbf//' < bomfile > newfile

Комментариев нет:

Отправить комментарий