Есть ли команда для замены текста в файле

Полезные советы и программы от пользователей нашего форума.

Модератор: Модераторы разделов

Аватара пользователя
Без имени
Сообщения: 72
ОС: Лиц. Mandriva 2008

Есть ли команда для замены текста в файле

Сообщение Без имени »

Есть ли в консоли команда, с помощью которой можно находить и заменять содержимое текстовых файлов? Что-то типа: ЗАМЕНИТЬ "сторока1" "строка2".
Не злитесь на мои вопросы пожалуйста! Все гуру начинали с чайников!
Спасибо сказали:
Аватара пользователя
moog
Сообщения: 599
ОС: Archlinux

Re: Есть ли команда для замены текста в файле

Сообщение moog »

vim позволяет и не такие фишки...
Спасибо сказали:
Аватара пользователя
alv
Бывший модератор
Сообщения: 7275
Статус: Пенсионер в законе
ОС: Cintu

Re: Есть ли команда для замены текста в файле

Сообщение alv »

ed, sed, любой развитый текстовый редактор
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Есть ли команда для замены текста в файле

Сообщение serzh-z »

Наверное, все же имелось в виду, что нужно консольное приложение, которое просто пройдется, без лишних телодвижений со стороны пользователя, по всем файлам и сделает замену. Имхо, без чтения манов sed или awk/gawk тут, увы, не обойтись, как, впрочем, и без связки "find + sed" или "find + awk".
Спасибо сказали:
Аватара пользователя
alv
Бывший модератор
Сообщения: 7275
Статус: Пенсионер в законе
ОС: Cintu

Re: Есть ли команда для замены текста в файле

Сообщение alv »

serzh-z писал(а):
12.11.2006 11:55
Наверное, все же имелось в виду, что нужно консольное приложение, которое просто пройдется, без лишних телодвижений со стороны пользователя, по всем файлам и сделает замену. Имхо, без чтения манов sed или awk/gawk тут, увы, не обойтись, как, впрочем, и без связки "find + sed" или "find + awk".

Да конечно, обычно для таких целей sed проще всего использовать, не нужно возиться с перенаправлениями и временными файлами.На posix.ru Madskull на конкретных примерах это здорово описал
Спасибо сказали:
Аватара пользователя
Без имени
Сообщения: 72
ОС: Лиц. Mandriva 2008

Re: Есть ли команда для замены текста в файле

Сообщение Без имени »

(serzh-z @ Nov 12 2006, в 11:55) писал(а):Наверное, все же имелось в виду, что нужно консольное приложение, которое просто пройдется, без лишних телодвижений со стороны пользователя, по всем файлам и сделает замену.

ДА!

Что-то слишком сложно всё получается. Лучше я сам напишу такую утилиту.
Не злитесь на мои вопросы пожалуйста! Все гуру начинали с чайников!
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Есть ли команда для замены текста в файле

Сообщение sash-kan »

(Без имени @ Nov 12 2006, в 12:39) писал(а):Лучше я сам напишу такую утилиту.

могу подсказать отправную точку:
find путь -type f -exec sed -i -e 's/строка1/строка2/' '{}' ';'


updated: набирая команду, напрочь упустил параметры sed-а. и ведь не поправил никто! обидно, да? (:
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
Без имени
Сообщения: 72
ОС: Лиц. Mandriva 2008

Re: Есть ли команда для замены текста в файле

Сообщение Без имени »

Написал! B)

Код: Выделить всё

package textreplace;

import java.io.*;

public class Main
{
    public static void showHelp()
    {
        System.out.println("Утилита для поиска и замены текста в файлах.");
        System.out.println("Синтаксис: TextReplacer ИмяФайла \"Исходная строка\" \"Новая строка\" ");
    }

    public static void replaceText(String file, String Orig, String Repl) throws FileNotFoundException, IOException
    {
        // Имя временного файла
        String TempFileName = file+"_temp";

        // Погнали замену!
        BufferedReader BR = new BufferedReader(new FileReader(file));
        BufferedWriter BW = new BufferedWriter(new FileWriter(TempFileName));
        while (BR.ready())
        {
            String S = BR.readLine();
            S = S.replaceAll(Orig, Repl);
            BW.write(S+'\n');
        }
        BW.close();
        BW.close();

        // Удаляем исходный файл и переименовываем временный
        File OF = new File(file);
        if (!OF.delete())
            System.out.println("Не удалось удалить исходный файл!");
        else
            new File(TempFileName).renameTo(OF);
    }

    public static void main(String[] args)
    {
        // Если никакие аргументы не переданы, то показываем хелп
        if (args.length!=3)
            showHelp();
        else
        {
            try
            {
                replaceText(args[0], args[1], args[2]);
            }
            catch (FileNotFoundException ex)
            {
                System.out.println("Файл не найден!");
            }
            catch (IOException ex)
            {
                ex.printStackTrace();
            }
        }
    }

}
Не злитесь на мои вопросы пожалуйста! Все гуру начинали с чайников!
Спасибо сказали:
Аватара пользователя
alv
Бывший модератор
Сообщения: 7275
Статус: Пенсионер в законе
ОС: Cintu

Re: Есть ли команда для замены текста в файле

Сообщение alv »

Коллеги-программеры - как? В проекты форума?
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Есть ли команда для замены текста в файле

Сообщение serzh-z »

Круто... Что там нужно - JDK теперь поставить? :)

alv
Наверное можно и в проекты... Для самых ленивых. Так, просто чтобы не пропало даром. Но, имхо, тогда уж туда нужно класть готовое к выполнению приложение Java. Потому как специально никто ставить JDK не будет. :)
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Есть ли команда для замены текста в файле

Сообщение Liksys »

alv писал(а):
12.11.2006 14:55
Коллеги-программеры - как? В проекты форума?

Ага. Перемещайте.

serzh-z писал(а):
12.11.2006 15:05
Потому как специально никто ставить JDK не будет. :)

Прадлагаю переписать на Питоне или С :)
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Есть ли команда для замены текста в файле

Сообщение serzh-z »

Liksys писал(а):
12.11.2006 15:17
Прадлагаю переписать на Питоне или С :)
Нафиг-нафиг, мне и "find + sed" хватит.
Спасибо сказали:
Аватара пользователя
alv
Бывший модератор
Сообщения: 7275
Статус: Пенсионер в законе
ОС: Cintu

Re: Есть ли команда для замены текста в файле

Сообщение alv »

(Liksys @ Nov 12 2006, в 15:17) писал(а):Прадлагаю переписать на Питоне или С

Вот в проектах все это и обсудить - на Си там, или Си++

PS а я уж по сермяжному - find да sed :)
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Есть ли команда для замены текста в файле

Сообщение serzh-z »

Гм, ну раз уж начали пьянствовать, то вот:

Код: Выделить всё

#!/bin/sh

TEMPFILE=`tempfile`

sed s/$2/$3/ $1 > ${TEMPFILE}
mv ${TEMPFILE} $1


Соответственно, все сводится к этому: find / -iname '*.txt' -exec my_replace GNU UNG {} \;
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Есть ли команда для замены текста в файле

Сообщение sash-kan »

serzh-z
в твоем скрипте с номерами параметров накладочка. по крайней мере, они не соответствуют приведенному примеру вызова скрипта.

p.s. хм. кстати, зачем создавать временный файл? sed это сделает сам. параметр -i ( http://linuxforum.ru/index.php?s=&show...st&p=280490 )

p.p.s. черт, ссылку на свой пост привел, а потом только увидел, что параметры-то там вообще отсутствуют (:
поправил.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
alv
Бывший модератор
Сообщения: 7275
Статус: Пенсионер в законе
ОС: Cintu

Re: Есть ли команда для замены текста в файле

Сообщение alv »

(sash-kan @ Nov 12 2006, в 15:49) писал(а):зачем создавать временный файл? sed это сделает сам

вот и я про то
и давно ведь уже делает :)
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Есть ли команда для замены текста в файле

Сообщение serzh-z »

sash-kan писал(а):
12.11.2006 15:49
serzh-z
в твоем скрипте с номерами параметров накладочка. по крайней мере, они не соответствуют приведенному примеру вызова скрипта.

p.s. хм. кстати, зачем создавать временный файл? sed это сделает сам. параметр -i
А, ну да. Имя файла первое должно быть. Я перед этим весь man sed перекопал на предмет того, чтобы обойтись без временного файла. Сэнкс за "-i" - оказывается я его искал. :)
Спасибо сказали:
Аватара пользователя
alv
Бывший модератор
Сообщения: 7275
Статус: Пенсионер в законе
ОС: Cintu

Re: Есть ли команда для замены текста в файле

Сообщение alv »

(serzh-z @ Nov 12 2006, в 15:56) писал(а):Я перед этим весь man sed перекопал на предмет того, чтобы обойтись без временного файла.

И опять же - а для кого Madskull свой труд писал?
http://posix.ru/shell/sed_tips/
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Есть ли команда для замены текста в файле

Сообщение serzh-z »

Его я читал когда-то, и даже распечатывал. Но увы, объем памяти не позволяет все помнить. :)
Спасибо сказали: