2012-06-15 2 views
1

Я пытаюсь найти и заменить пару слов в файл и попытаться выполнить этот файл как файл .sqlОбновление файла с SED

sed -e "s/wordToFind1/UnixFile/g" Check.sql; 
sed -e "s/wordToFind2/WordToReplace2/g" Check.sql; 

В выше, я пытаюсь найти wordToFind1 и заменить его UnixFile: /usr/bin/try.txt , а затем, пытаясь найти wordToFind2 и заменить его другим словом: TABLENAME

Перед SED - Check.sql:

servermonitor on 
spool wordToFind1 
select * from wordToFind2 

После SED - Check.sql:

servermonitor on 
spool /usr/bin/try.txt 
select * from tablename 

После того, как вышеуказанные изменения сделаны, я пытаюсь выполнить файл SQL. Пожалуйста помоги!!!

+0

Вы не выполняете файл sql, а просто загружаете его в инструменты командной строки базы данных ... –

+0

В чем вопрос? – nhahtdh

+0

Я не хочу помещать содержимое plsql в скрипт unix, я хотел, чтобы он был в отдельном файле. Можете ли вы дать мне образец. –

ответ

0

Я не могу получить что-то в sed. Поэтому я использовал awk. Передайте Replace1 и Replace2 в качестве аргумента скрипту оболочки, который создаст ip.sql с соответствующими значениями.

#!/bin/bash 
awk -v R1=$1 -v R2=$2 '{gsub("wordToFind1",R1);gsub("wordToFind2",R2);print}' ip.sql > t.sql; 
mv t.sql ip.sql; 
+0

, он работает с файловым файлом unix в качестве слова для замены .. его не работает для меня :( –

+0

Я пробовал с этими двумя параметрами ./h4.sh /usr/bin/try.txt tablename и он отлично работает – Raghuram

+0

Спасибо Рагху, да, это так! :) –

4

У вас возникли проблемы с решением проблемы.

Использование косые (/) внутри 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 

Это может быть полезно, если что-то пойдет не так.

+0

Проблема в том, что строка замены должна быть динамической – Raghuram