сценарий bash / sh для замены текста между некоторыми тегами / строками в текстовом файле

Это не совсем то, что помещает все в одно и то же место, но, по крайней мере, позволяет вам получить доступ ко всему, что вам нужно, как если бы оно было. Он должен решить ваши проблемы с доступом, поместив каждую платформу в свою собственную систему и позволяя вам видеть все свои источники как один диск или как вы решите настроить его.

https://infinit.sh/

Они описывают это как децентрализованную программную платформу для хранения файлов.

Я планирую использовать ее сам, чтобы иметь единую точку доступа к моему ноутбуку / дому и облачные диски из одной точки. Затем для каждой платформы существуют клиенты для доступа к данным аналогично тому, как работает DropBox.

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

4
26.03.2016, 07:34
4 ответа

Поскольку у вас есть два состояния, что наличие двух разных строк смещения между ними - задача для awk (или perl, или python). Поскольку мой текущий язык - python, программа будет выглядеть так:

import sys

rule_file = sys.argv[1]
new_rules = sys.argv[2]

mode = "save_rules"
for line in open(rule_file):
    line = line.strip()
    if line == "#start":
        print line
        print new_rules
        mode = "replace_rules"
    elif line == "#end":
        mode = "save_rules"
        print line
    elif mode == "save_rules":
        print line

Теперь сохраните это в rule_replace.py и вызовите его с помощью

python rule_replace.py my_rule_file.txt 'FirewallRuleSet global {
FirewallRule allow tcp to google.com
FirewallRule deny tcp to facebook.com
FirewallRule deny tcp to twitter.com
FirewallRule allow tcp to exaple.com



#more rules
}' >new_rules.txt

. Конечно, вам не нужно помещать новые правила в командную строку, я предполагаю, что вы будет иметь их в переменной оболочки, и тогда вызов будет выглядеть так:

$ python rule_replace.py my_rule_file.txt $new_rules

Обратите внимание, что этот сценарий, хотя он работает, не является решением для чего-то в производстве. Он не обнаруживает никаких ошибок (например, если нет исходного файла). Он предполагает, без проверки, что за строкой #start всегда следует строка #end и что строки точно такие, как вы описали. Он также может использовать некоторое ведение журнала, если будет запущен в производство.

0
27.01.2020, 20:49

На основе ответа G-Man и комментария:

sed -i '/#start/,/#end/ {
//!d
/#start/a\
some new text\
more lines\
end of new text (no backslash here!)
}' myconfig

Объяснение:

  1. / # start /, / # end / {....} выполняет команды в фигурных скобки для каждой строки между текстом «#start» и «#end» (включительно). Сравните ответ G-Man.
  2. a - это команда добавления. Он выполняется только в строке, соответствующей "#start", чтобы добавить новый текст. Он добавляет строки до тех пор, пока не появится строка, которая не заканчивается обратной косой чертой + новой строкой.
4
27.01.2020, 20:49

Используйте

sed '/#start/,/#end/replace_command'

Например, если файл называется myconfig , и вы хотите заменить "разрешить "с" запретить "в этом разделе можно сказать

sed '/#start/,/#end/s/allow/deny/' myconfig

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

sed -i '/#start/,/#end/s/allow/deny/' myconfig

Если вы хотите заменить весь текст ( все текст) между этими двумя строками, вы можете сделать что-то более простое, чем ответ Лукаса :

sed '/#start/,/#end/c\
New text line 1\
New text line 2\
        ︙      \
New text line n-1\
New text line n (last)'                                   ← Close quote; no backslash here

c это c hange в sed ed ); это означает «заменить всю строку (строки)». Нельзя просто оставить строки #start и #end нетронутыми. Если вы хотите сохранить их, вы должны снова вставить их:

sed -i '/#start/,/#end/c\
#start\
FirewallRuleSet global {\
    FirewallRule allow tcp to google.com\
    FirewallRule deny tcp to facebook.com\
                      ︙                 \
\
#more rules\
}\
#end' myconfig

/ # start /, / # end / указывает диапазон - строки из первой строки, содержит #start через первую строку после той, которая содержит #end . Если вам нужно найти строки, содержащие эти строки и ничего больше, используйте / ^ # start $ /, / ^ # end $ / .

6
27.01.2020, 20:49

Создание G -Ответ человека, вот как это сделать И использовать настраиваемые разделители И подстановку переменных (Из-за сложности это не было сразу очевидно)

Дан входной файл.txt:

Line1
Line2
<!-- /START_MARKER/ -->
Line4
Line5
Line6
<!-- /END_MARKER/ -->
Line8
Line9

Используйте эти команды/скрипт:

customtext="Any kind of variable text here"

sed -i '\%<!-- /START_MARKER/ -->%,\%<!-- /END_MARKER/ -->%c\
foo '"$customtext"' abcxyz whatever' inputfile.txt

Результаты в:

Line1
Line2
Any kind of variable text here
Line8
Line9

Здесь многое происходит, объяснено ниже:

'-Чтобы заключить все в одинарные кавычки

\%-При использовании пользовательского разделителя (, например. если ваш маркер имеет /вы ДОЛЖНЫ использовать другой разделитель )он должен быть экранирован здесь

<!-- /START_MARKER/ -->-буквальный маркер начала, в данном случае это дурацкий пример для демонстрационных целей.

%-разделитель sed, не экранированный

,-запятая (?)

\%-снова разделитель sed, на этот раз ДОЛЖЕН быть экранирован

<!-- /END_MARKER/ -->-Буквенный маркер окончания

%c-разделитель sed (не экранирован )иc

\-обратная косая черта, означающая, что следующий текст/строки следует использовать в качестве замены

foo-текст замены

'"$customtext"'-текст пользовательской переменной,обратите внимание на использование ', а затем "для включения замены переменных, затем "и 'для возврата в режим произвольного текста

abcxyz whatever-дополнительный текст замены

'-закрывающая одинарная кавычка

inputfile.txt-имя файла

0
27.01.2020, 20:49

Теги

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