LINUX.ORG.RU

Как добавить несколько строк в файл


0

0

Начал заниматься администрированием, конечно встал вопрос написания скриптов. Простенький вопрос.

как добавить несколько строк в файл. Допустим я хочу добавить две строки 5 и 6 cat /path/file | sed '5a\ строка1'>/path/file - работает а после cat /path/file | sed '5a\ строка1'>/path/file cat /path/file | sed '6a\ строка2'>/path/file остается пустой файл нулевой длины

Как это решается И еще - как загнать произвольный текст в файл Раньше делал так

cat <<EOF>> ./mail.sql строка1 строка2 строка3 EOF Все работало

Попробовал засунуть текст SQL запроса - так половина текста куда то исчезает, половина интерпретируется как команды. Еще раз КАК?

СПАСИБО.


>остается пустой файл нулевой длины

вместо конструкции cat /path/file | sed '5a\ строка1'>/path/file

используй

sed -i '5a\ строка1' /path/file

>так половина текста куда то исчезает, половина интерпретируется как команды.

используй экранирование

arax ★★
()
Ответ на: комментарий от Shmuma

А может кто нибудь подскажет почему этот вариант работает без ошибок cat <<EOF>> mail.sql INSERT INTO \`domains\` (\`domain\`) VALUES ('domain.ru'); EOF А вот такой cat <<EOF>> mail.sql INSERT INTO `domains` (`domain`) VALUES ('domain.ru'); EOF бьет две ошибки ./s: line 5: domains: команда не найдена ./s: line 5: domain: команда не найдена и в результирущем файле INSERT INTO () VALUES ('domain.ru');

Soloik
() автор топика
Ответ на: комментарий от Soloik

Прошу прощения - плохое форматирование А может кто нибудь подскажет почему этот вариант работает без ошибок cat <<EOF>> mail.sql INSERT INTO \`domains\` (\`domain\`) VALUES ('domain.ru'); EOF А вот такой cat <<EOF>> mail.sql INSERT INTO `domains` (`domain`) VALUES ('domain.ru'); EOF бьет две ошибки line 5: domains: команда не найдена line 5: domain: команда не найдена и в результирущем файле INSERT INTO () VALUES ('domain.ru');

Soloik
() автор топика
Ответ на: комментарий от Soloik

Да елы палы

Прошу прощения - плохое форматирование

А может кто нибудь подскажет почему этот вариант работает без ошибок

cat <<EOF>> mail.sql

INSERT INTO \`domains\` (\`domain\`) VALUES ('domain.ru');

EOF

А вот такой

cat <<EOF>> mail.sql

INSERT INTO `domains` (`domain`) VALUES ('domain.ru');

EOF

бьет две ошибки

line 5: domains: команда не найдена

line 5: domain: команда не найдена

и в результирущем файле

INSERT INTO () VALUES ('domain.ru');

Soloik
() автор топика
Ответ на: комментарий от Soloik

Написал и понял - кавычки не в ту сторону ` и ' разные вещи.

Прошу прощения - вопрос снят

Хотя непонятка все равно осталась почему то что должно просто записаться в файл и все интерпретируется как команда

Soloik
() автор топика
Ответ на: комментарий от Soloik

Дык нужно читать то что советуют:

man bash, раздел "Here Documents":

If any characters in word are quoted, the delimiter is the result of quote removal on word, and the lines in the here-document are not expanded.  If word is unquoted, all lines of the here-document are subjected to parameter  expansion,  command  substitution,  and arithmetic expansion.

То есть вот это:
cat<<EOF
echo $PATH
EOF

Выводит: 
echo <содержимое $PATH>

А вот это:
cat<<"EOF"
echo $PATH
EOF

Выводит:
echo $PATH

Shmuma
()
Ответ на: комментарий от Shmuma

Блин, чертово форматирование...

If any characters in word are quoted, the delimiter is the result of quote removal on word, and the lines in the here-document are not expanded. If word is unquoted, all lines of the here-document are subjected to parameter expansion, command substitution, and arithmetic expansion.

Shmuma
()
Ответ на: комментарий от Shmuma

Спасибо. Надо запомнить это интересно и может пригодиться.

Soloik
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.