Замена текста:

Способ 1: Замена подстроки с помощью perl:

perl -e 's/foo/bar/g' -pi ./index.html

Способ 2: Замена с помощью sed:

sed -e 's/foo/bar/g'  ./index.html > index_new.html

Способ 3: Замена с помощью awk

awk '{gsub("foo", "bar", $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