У вас возникли проблемы с решением проблемы.
Использование косые (/
) внутри s///
Во-первых, вы хотите заменить wordToFind1
с /usr/bin/try.txt
. Сначала он не будет работать с командой s///
, потому что строка замены содержит /
. Это было бы очень странно!
sed -e 's/wordToFind1//usr/bin/try.txt/' Check.sql
Sed будет думать, что команда s/wordToFind1//
с некоторыми флагами (такие как u
) и другими командами следующими, но это не имеет никакого смысла, и он будет генерировать ошибку. Решение состоит в том, чтобы избежать каждый /
из /usr/bin/try.txt
с \
:
$ sed -e 's/wordToFind1/\/usr\/bin\/try.txt/' Check.sql
servermonitor on
spool /usr/bin/try.txt
select * from wordToFind2
Это неуклюжее, однако. Когда у вас много /
в вашей заменяющей строке (или даже в замененной строке), лучшим решением IMHO является использование другого символа в качестве разделителей s///
. Не все знают, что это возможно, но в качестве разделителя s///
можно использовать любой другой символ вместо /
. В этом случае вы можете использовать столько /
, сколько хотите внутри своих выражений, не требуя их ускорения. В приведенном ниже примере я использую #
вместо /
, так что косые от /usr/bin/try.txt
причины не беда:
$ sed -e 's#wordToFind1#/usr/bin/try.txt#' Check.sql
servermonitor on
spool /usr/bin/try.txt
select * from wordToFind2
Использование более одного s///
команды
Решено, что вы должны также заменить wordToFind2
.Это очень просто: просто передать другой -e
команду в том же SED вызова:
$ sed -e 's#wordToFind1#/usr/bin/try.txt#' -e 's/wordToFind2/tablename/' Check.sql
servermonitor on
spool /usr/bin/try.txt
select * from tablename
(Другой вариант заключается в добавлении более одного варианта в одной строке только separarated точкой с запятой:
$ sed -e 's#wordToFind1#/usr/bin/try.txt#;s/wordToFind2/tablename/' Check.sql
servermonitor on
spool /usr/bin/try.txt
select * from tablename
Я считаю, это очень полезно иногда, с большими сценариями sed, но это менее читаемо).
Обновление входного файла с -i
Теперь вам необходимо обновить файл Check.sql
. Это также легко: просто передайте флаг -i
в sed. Этот флаг позволяет sed обновить исходный файл. Кроме того, этот флаг может принимать параметр, который является добавочным добавлением в файл резервной копии с исходным контентом. В этом случае я буду использовать расширение .bkp
. См. Результаты:
$ sed -i.bkp -e 's#wordToFind1#/usr/bin/try.txt#' -e 's/wordToFind2/tablename/' Check.sql
$ cat Check.sql
servermonitor on
spool /usr/bin/try.txt
select * from tablename
Теперь, Check.sql
изменен. Кроме того, есть Check.sql.bkp
со старым содержанием:
$ cat Check.sql.bkp
servermonitor on
spool wordToFind1
select * from wordToFind2
Это может быть полезно, если что-то пойдет не так.
Вы не выполняете файл sql, а просто загружаете его в инструменты командной строки базы данных ... –
В чем вопрос? – nhahtdh
Я не хочу помещать содержимое plsql в скрипт unix, я хотел, чтобы он был в отдельном файле. Можете ли вы дать мне образец. –