LINUX.ORG.RU

Вставка файла в файл

 


0

1

Возникла надысь нужда в (несколько нетривиальной для моего уровня знания sed) массовой правке конфигов. Нужно вставить порядка 20 строк (в том числе спецсимволы, переводы строк и прочее) в конфиг. Подозреваю использование переменной для хранения нового куска чревато слишком большим геморроем(хотя такой вариант мне нравится больше), поэтому видимо придётся использовать временный файл. Интересуют варианты релизации для следующих случаев: вставка в n-ю строку, вставка до/после маркера

cast emulek

★★★★★

тогда уж ed, а не sed

vel ★★★★★
()

cat tail head? Вообще многие программы позволяют включать в конфиг внешние файлы.

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

это структурированные конфиги с секциями, по сути ini файлы, поэтому хотелось бы гибкое некостыльное решение на будущее, наверняка sed или perl умеют это

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

по сути ini файлы
гибкое некостыльное решение на будущее

В чём проблема использовать любую библиотеку для работы с ini?

Gotf ★★★
()

вставка в n-ю строку

после строки:

seq 10 | sed '7r 1.txt'

вместо строки:

seq 10 | sed -n '7!p;7r 1.txt'

вставка после маркера

echo -e "123\nqwe\nasd\nzxc\n" | sed '/qwe/r 1.txt'

вставка до маркера

echo -e "123\nqwe\nasd\nzxc\n" | sed '/qwe/{
h
r 1.txt
g
N
}'
anonymous
()

вставка в n-ю строку, вставка до/после маркера

Ну и в чем проблема, в сложно пролистать ман? (c номерами, или в конец - без проблем, перед шаблоном - возмжно придется через hold-buffer). btw awk будет чуть лучше: можно разделять по RS, примерно так awk '/^ *[[]section[]]/ { while (getline line < "file") print line } 1'.

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

можно разделять по RS

Ой, пропустил. Ладно, это не очень к месту).

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

Ну с повторениями понятно. А это неприятный сюрприз, насколько понимаю, sed кидает в stdout, а flush (или что-то вроде) в конце итерации. Ну можно (ради спортивного интереса) окостылить гнутым head: { ...; printf "\n\n"; } | sed -e '/qwe/ { h; r 1.txt' -e 'g; N }' | head -n-2.

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

кстати проще есть конструкция:

echo -e "123\nqwe\nasd\nzxc\n" | sed -e '/zxc/r 1.txt' -e //N
но ни одну из ошибок эта конструкция не исправляет

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

не в одном sed не интересно, можно вместо head и printf ещё один sed:

echo -e "123\nqwe\nasd\nzxc\nzxc" |
sed 's/zxc/BLACK MAGIC\n&/' |
sed '/^BLACK MAGIC$/{r 1.txt
d}'

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

Спасибо, мой далёкий анонимный аноним

zolden ★★★★★
() автор топика

Интересуют варианты релизации для следующих случаев: вставка в n-ю строку, вставка до/после маркера

видимо нужны sed-команды i,a.

А может лучше W. Или может R.

Вариантов вообще-то много разных. Иногда проще не насиловать мозг, а взять нормальный ЯП.

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

что делать? Задержать одну строчку, и выводить _прошлую_ строку, а не ту, которая пришла:

$ echo -e "123\nqwe\nqwe\nasd\nzxc\n" | sed -n '/qwe/{r 1.txt
x;1!p;b};x;1!p'

тут мне посл. строку исправлять лениво.

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

ну если во вводе нет ничего страшного, то можно вот так:

$ echo -e "123\nqwe\nqwe\nasd\nzxc\n\"qwe" | sed '/qwe/{s/.*/cat 1.txt;echo \x27&\x27/e}'

это не проканает, если во вводе есть одиночные кавычки.

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