Уведомления

Группа в Telegram: @pythonsu

#1 Май 15, 2017 17:47:43

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Поиск слов в файле и его замена с предварительным бэкапом этих файлов!

Это любой регистр при поиске содержимого и замене и исключение директорий:

get_paths()
{
find "$1" 2>/dev/null
}

paths_filter_files()
{
while read line; do
[ -f "$line" ] && echo "$line"
done
}

files_filter_exts()
{
local exts=${1//|/\\|}

grep '\.\('"$exts"'\)$'
}

exclude_dirs()
{
local dirs=${1//|/\\|}

grep -v '/'"$dirs"'/'
}

search_exts_in_directory()
{
local dir=$1
local exts=$2

get_paths "$dir" | paths_filter_files | files_filter_exts "$exts"
}

files_filter_by_content_icase()
{
local contents=${1//|/\\|}

while read line; do
grep -q -i "$contents" "$line" 2>/dev/null && echo "$line"
done

}

ymd()
{
date '+%Y-%m-%d'
}

make_backup_name()
{
sed 's/$/'".$(ymd).backup"'/'
}

make_backup()
{
local src=$1
local dst=$2

while [ -e "$dst" ]; do
dst="${dst}_"
done
cp "$src" "$dst"
}

replace_in_file_icase()
{
local fname=$1
local pat=$2
local rep=$3

sed -i 's/'"$pat"'/'"$rep"'/ig' "$fname"
}

convert_with_backup()
{
local pattern=${1//|/\\|}
local replacement=$2
local backup_name

while read line; do
backup_name=$(echo "$line" | make_backup_name)
make_backup "$line" "$backup_name"
replace_in_file_icase "$line" "$pattern" "$replacement"
echo "$line"
done
}

main()
{
search_exts_in_directory /tmp/test "txt|xml" | \
exclude_dirs "dir1|dir2" | \
files_filter_by_content_icase "user|server" | \
convert_with_backup "test1|test2" "testtest" >/dev/null
}

main


Aversus
-Конечно бывают ситуации когда есть записи вида cpp@poddomen.mycompamy1.com - естественно скрипт его не обработает.
Надо передавать регулярное выражение
convert_with_backup "@[^ ]*mycompany[12]\.com" "@mycompany3.com"



Отредактировано py.user.next (Май 15, 2017 18:01:36)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version