LINUX.ORG.RU

Поиск и замена текста через шелл


0

0

Здраствуйте.

Имеется VDS с установленной Fedora 6. Доступ к нему осуществляется через клиент для SSH (putty). Есть права для установки программ (консольных).

На этом сервере находится много текстовых файлов (более 100) в которых надо заменить один фрагмент текста на другой.

Помогите найти программу для поиска и замены текста в нескольких файлах сразу (чтобы не заходить в каждый отдельно). Или может есть комманды для таких целей.

Спасибо.

anonymous

Скрипт предназначен для поиска и замены одной подстроки на другую во всех файлах определенной директории на сервере (включая файлы во всех вложенных поддиректориях)

Которые понимают - легко сделают вариант с регулярными выражениями для себя.

---------- sr.php - начало цитаты ---------

<? $work_dir="./"; // рабочая директория - обязательно должна заканчиваться // символом "/"

$excl_dir=array(); $excl_dir[0]="./no_work_here/"; $excl_dir[1]="./and_here/and_here/";

// директории, где поиск/замена не производятся - обязательно должны заканчиваться // символом "/"

$file_mask_1=".html"; $file_mask_2=".js"; // маски обрабатываемых файлов (будут обработаны все файлы, // содержащие данную строку в имени)

$search_str="test"; #что ищем $replace_str="TEST"; #чем заменяем

//******************************************************

$level=0;

function sr($dir) { global $level,$file_mask_1,$file_mask_2,$search_str,$replace_str,$excl_dir; echo "<b>"; for ($i=0;$i<$level;$i++) echo "* * "; echo $dir."</b>";

if (@in_array($dir,$excl_dir)) { echo " - needn't search & replace<br>"; return; }

echo "<br>";

$p = dir($dir); while($ent=$p->read()) { if ($ent!="." && $ent!=".." && !is_dir($dir . $ent) && (eregi(sql_regcase($file_mask_1),$ent) || eregi(sql_regcase($file_mask_2),$ent))) { $tmp=@file($dir.$ent); $str=@implode("",$tmp);

if (strpos("@!#%xrenoder^&*()".$str,$search_str)) { for ($i=0;$i<($level)+1;$i++) echo "* * "; echo $dir.$ent." found...";

$str=str_replace($search_str,$replace_str,$str);

if ($fp=@fopen($dir.$ent, "w")) { flock($fp,LOCK_EX); fwrite($fp,$str); fclose($fp); echo " and replace<br>"; } else echo " and <b>can't replace</b><br>"; }

} elseif($ent!="." and $ent!=".." and is_dir($dir . $ent)) { $level++; sr($dir.$ent."/"); $level--; } } $p->close();

return; }

sr($work_dir);

echo "SEARCH & REPLACE Complete";

?>

---------- sr.php - конец цитаты ---------

Tramper
()
Ответ на: комментарий от Tramper

Можно ещё на перле (man perl). Что-нибудь в духе: perl -pi'*.old' -e 's/old_text/new_text/' *.html

aleksey_t
()
Ответ на: комментарий от AnDoR

или даже

find path -print0 | xargs -0 sed -i 's/чево менять/на кого менять/'

lodin ★★★★
()
Ответ на: комментарий от AnDoR

рекурсивно?

Все ж предпочитаю qwk\grep

Данный вариант подходит, когда у тебя нет шелла на удаленном серваке (виртуал хостинг к примеру), а замену надо делать.

Tramper
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.