Многострочная замена

Я не уверен, имеет ли Лев /etc каталог или не (я принимаю это, делает), или ли /etc/bashprofile или /etc/bashrc находится на самом деле в том каталоге, но если Вы хотите внести это изменение в масштабе всей системы, просто искать любой из этих файлов, отредактируйте его и внесите изменение там как так:

export PATH=$PATH:/path/to/Java/

Затем войдите в систему, возьмет изменение и будет сохранен.

8
26.02.2013, 01:10
5 ответов

Если у Вас есть текст, который будет вставлен в маркере (маркерах) в файле под названием /tmp/insert.txt, можно выполнить эту задачу следующим образом:

sed '/MARKER/ r /tmp/insert.txt' < inputfile

Вышеупомянутое sed команда будет читать "inputfile" и искать МАРКЕР. Когда это находит его, это вставляет содержание /tmp/insert.txt в поток вывода.

Если Вы хотите, чтобы сам маркер был удален, попробуйте это:

sed '/MARKER/ {s/MARKER//; r /tmp/insert.txt
}' <inputfile

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

Как в первой команде, sed будет воздействовать на строки с МАРКЕРОМ. Это заменит МАРКЕРОМ ни с чем, и затем это будет читать в /tmp/insert.txt

3
27.01.2020, 20:12

Я использовал бы ex для такой задачи, если у Вас действительно нет потока данных. Я сохранил бы ex команды в здесь документе:

ex $FILENAME << END_EX_COMMANDS
" Find the mark, assuming it's an entire line
/^MARKER$/
" Delete the marker line
d
" Add the complex, multi-line text
a
Complex, vividly formatted text here.
Even more "specially" formatted text.
.
" The '.' terminates the a-command. Write out changed file.
w!
q
END_EX_COMMANDS

Используя ex преимущество для vi или vim пользователи: они уже знают нажатия клавиш для команд, хотя это дает Вам сенсацию редактирования слепого. Можно также сделать, несколько добавляют или глобальные замены, что-либо это vim может выполнить ':' режим.

3
27.01.2020, 20:12

Я полагаю, что эта команда - то, что Вы ищете:

r FILENAME
     As a GNU extension, this command accepts two addresses.

     Queue the contents of FILENAME to be read and inserted into the
     output stream at the end of the current cycle, or when the next
     input line is read.  Note that if FILENAME cannot be read, it is
     treated as if it were an empty file, without any error indication.

     As a GNU `sed' extension, the special value `/dev/stdin' is
     supported for the file name, which reads the contents of the
     standard input.
2
27.01.2020, 20:12

Вот упрощенная версия ответа Брюса Эдигера с использованием команды изменения , которая представляет собой комбинацию удаления и добавить.

ex $FILENAME << EOEX
/^MARKER$/c
The new text
to be inserted
here.
.
w!
q
EOEX
0
27.01.2020, 20:12

Если вы хотите удалить сам маркер, попробуйте это в одной строке:

sed -e '/MARKER/ r /tmp/insert.txt' -e '/MARKER/d' < inputfile

или

sed -e '/MARKER/ {r /tmp/insert.txt' -e 'd }' < inputfile
0
27.01.2020, 20:12

Теги

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