Как заменить текстовую строку в нескольких файлах в Linux

Да, "Мы" видим то, что Вы делаете, длинная короткая история.

Здесь, мы используем Altiris, чтобы позволить Справочной службе администрировать Вашу машину издалека, а также выполнить измерение приложения, выпуская стандарты конфигурации под маской быстрого развертывания изображения.

В нашей сети и в нашей компании, Skype является запрещенным приложением.

Если Вы установите его благодаря измерению приложения, то мы будем знать в течение 24/48 часов.

Altiris также идет с функцией дистанционного управления, которая может быть скрыта от зарегистрированного пользователя. (По крайней мере, значок дисплея панели задач, и т.д.), Если bosses-that-be решают Вас, должен контролироваться, после того, как наша система посылает нам по электронной почте, что Вы установили Skype, затем мы сделаем так.

Помните, что "Использование электронного оборудования компании составляет согласие на контроль", и т.д., вздор, вздор? Возможно, это было сформулировано по-другому в Вашей компании. Так или иначе я поставлю Вас банка содовой воды, что Ваш сэр IT, HR и Легальное управление договорились об этой политике.

Скажем, то, что Вы устанавливаете Skype так или иначе, и мы не ловим его некоторое время. Я - все еще довольно хороший сетевой администратор, хотя, я, вероятно, поймаю трафик от него на одном из моих wireshark или LanHound, контролирующего ноутбуки.

Или, Вы могли просто выкрикнуть свой сотовый телефон и звонить, кто бы ни это - Вы, хотят говорить, абсолютно независимый от Вашей сети работы. В той точке все, о чем необходимо волноваться, является NSA.:)

И Вы не делаете ничего плохого, правильно?

3
задан 3 October 2009 в 02:25
6 ответов

Я использовал бы Python для этого. Поместите весь этот код в файл, названный mass_replace и"chmod +x mass_replace":

#!/usr/bin/python

import os
import re
import sys

def file_replace(fname, s_before, s_after):
    out_fname = fname + ".tmp"
    out = open(out_fname, "w")
    for line in open(fname):
        out.write(re.sub(s_before, s_after, line))
    out.close()
    os.rename(out_fname, fname)


def mass_replace(dir_name, s_before, s_after):
    for dirpath, dirnames, filenames in os.walk(dir_name):
        for fname in filenames:
            f = fname.lower()
            # example: limit replace to .txt, .c, and .h files
            if f.endswith(".txt") or f.endswith(".c") or f.endswith(".h"):
                f = os.path.join(dirpath, fname)
                file_replace(f, s_before, s_after)

if len(sys.argv) != 4:
    u = "Usage: mass_replace <dir_name> <string_before> <string_after>\n"
    sys.stderr.write(u)
    sys.exit(1)

mass_replace(sys.argv[1], sys.argv[2], sys.argv[3])

Для единственного поиска и замены одной строки в одном типе файла, решение с находкой и sed не плохо. Но если Вы хотите сделать большую обработку в одной передаче, можно отредактировать эту программу для расширения ее, и это будет легко (и вероятно быть корректным в первый раз).

0
ответ дан 3 December 2019 в 05:57

Принятие списка файлов не одна миля длиной, Вы не должны использовать xargs, поскольку sed может обработать несколько файлов на командной строке:

sed -i -e 's/oldstring/newstring/' `grep -rl oldstring .`
0
ответ дан 3 December 2019 в 05:57

Используя GNU находят, xargs и sed как это:

 find -name '*.txt' -o -name '*.html' -print0 | xargs -0 -P 1 -n 10 sed --in-place 's/oldstring/newstring/g'

Корректируйтесь -P и -n параметры, поскольку Вам нравится. /g необходим так, чтобы каждое возникновение в строке было заменено, не только первая (g обозначает глобальный, если я помню правильно). Можно также передать значение --in-place сделать резервное копирование.

3
ответ дан 3 December 2019 в 05:57

Мне нравится оперативный рецепт фильтрации perl.

   perl -pi.bak -e 's/from/to/' file1 file2 ...

В контексте...

% echo -e 'foo\ngoo\nboo' >test
% perl -pi.bak -e 's/goo/ber/' test
% diff -u test.bak test
--- test.bak    2010-01-06 05:43:53.072335686 -0800
+++ test    2010-01-06 05:44:03.751585440 -0800
@@ -1,3 +1,3 @@
 foo
-goo
+ber
 boo

вот обрезанный справочник на используемом колдовстве жемчуга...

% perl --help
Usage: perl [switches] [--] [programfile] [arguments]
  -e program        one line of program (several -e's allowed, omit programfile)
  -i[extension]     edit <> files in place (makes backup if extension supplied)
  -n                assume "while (<>) { ... }" loop around program
  -p                assume loop like -n but print line also, like sed
3
ответ дан 3 December 2019 в 05:57

Спасибо всем за отличные ответы! Это было очень полезно.

Поскольку у меня не было сотен файлов для замены строк, я использовал цикл do, например:

   for R in 1 2 3 4 5; do sed -i -e 's/oldstring/newstring/' file$R; done

Надеюсь, это поможет!

-1
ответ дан 3 December 2019 в 05:57

Будьте осторожны, заменяя URL-адреса символом "/".

Пример того, как это сделать:

sed -i "s%http://domain.com%http://www.domain.com/folder/%g" "test.txt"

Извлечено из: http://www.sysadmit.com /2015/07/linux-reemplazar-texto-en-archivos-con-sed.html

0
ответ дан 3 December 2019 в 05:57

Теги

Похожие вопросы