LINUX.ORG.RU
ФорумAdmin

Sed и работа с многострочным текстом

 


0

1

Ребята подскажите, задача на первый взгляд простая. Нужно добавить в файл конструкцию вида:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2szClAV/gGLVvxRWmwdf
S+vEOvlShz+t2clXYXvLOzDID+Jyqq71n4rcV0WYdBnpz1f0vBWPSoYo12zAKHXx
N67StFAxzsu+twD0AwJRzwB7seuCxVZrV3Qua/s0achWYcfMSV7ymvXcNCiZuFRU
JJTQ9sbzJWBA8cpHml3p/OJQDAyjWqa/8sDJZmT7enINsvniF+IXraY2AuNICaHo
QiESh6J4rDDJWaWju/cWJzwZM37W2yVQ4fPftVG9y8hOUvdTehvEw2tSdjHpKBjD
70ozZ9+beJXTQQLOuXW0ytxKeQEitTB3dD7YjRyS/aW829fRLGunH6cdhDik+jkO
nQIDAQAB
-----END PUBLIC KEY-----
Ну то-есть обычный ключ. Но поскольку там есть переводы строки sed ругается sed: -e expression #1, char 79: unknown command: `M' и всё такое. Помогите плиз.


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

Не, ну не всё так просто :) Нужно ключ добавить в определённое место файла (это конфиг), т.е. сделать либо substitute какой-нибудь условной <PUBLIC_KEY_HERE>, либо append после определённой строки. Сорри что не написал раньше :)

Loess
() автор топика

поскольку там есть переводы строки

А что разве переводы строки обязательны в ключе? ЕМНИП это просто для читабельности.

Вообще не очень понимаю что так все фапают на этот sed, если везде есть awk.

no-such-file ★★★★★
()

ключ в отдельный файл
в конфиг опцию с именем файла, где ключ
/thread

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

А что разве переводы строки обязательны в ключе? ЕМНИП это просто для читабельности.

Клиент очень хочет, что-бы ключ в конфиге был такой ровненький с переводами строки. Если есть решение на awk, то это замечательно.

Loess
() автор топика

Можно через ed, а не sed:


ed /tmp/test.txt << EOF
3a
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2szClAV/gGLVvxRWmwdf
S+vEOvlShz+t2clXYXvLOzDID+Jyqq71n4rcV0WYdBnpz1f0vBWPSoYo12zAKHXx
N67StFAxzsu+twD0AwJRzwB7seuCxVZrV3Qua/s0achWYcfMSV7ymvXcNCiZuFRU
JJTQ9sbzJWBA8cpHml3p/OJQDAyjWqa/8sDJZmT7enINsvniF+IXraY2AuNICaHo
QiESh6J4rDDJWaWju/cWJzwZM37W2yVQ4fPftVG9y8hOUvdTehvEw2tSdjHpKBjD
70ozZ9+beJXTQQLOuXW0ytxKeQEitTB3dD7YjRyS/aW829fRLGunH6cdhDik+jkO
nQIDAQAB
-----END PUBLIC KEY-----
.
w
q
EOF

-- вставит после третьей строчки. Только нужно разумеется не после третьей строчки, а найти как в ed pattern matching сделать. (Я не умею ^_^)

d_a ★★★★★
()
Ответ на: комментарий от no-such-file

Вообще не очень понимаю что так все фапают на этот sed, если везде есть awk.

Странно не это, а то, что ещё никто не предложил написать программу на пыхтонге.

d_a ★★★★★
()
[user@srv]$ cat key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2szClAV/gGLVvxRWmwdf
S+vEOvlShz+t2clXYXvLOzDID+Jyqq71n4rcV0WYdBnpz1f0vBWPSoYo12zAKHXx
N67StFAxzsu+twD0AwJRzwB7seuCxVZrV3Qua/s0achWYcfMSV7ymvXcNCiZuFRU
JJTQ9sbzJWBA8cpHml3p/OJQDAyjWqa/8sDJZmT7enINsvniF+IXraY2AuNICaHo
QiESh6J4rDDJWaWju/cWJzwZM37W2yVQ4fPftVG9y8hOUvdTehvEw2tSdjHpKBjD
70ozZ9+beJXTQQLOuXW0ytxKeQEitTB3dD7YjRyS/aW829fRLGunH6cdhDik+jkO
nQIDAQAB
-----END PUBLIC KEY-----
[user@srv]$ cat config.tmpl
name: superapps
key:
param1: value1
param2: value2
[user@srv]$ sed '/^key:$/ r key' config.tmpl
name: superapps
key:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2szClAV/gGLVvxRWmwdf
S+vEOvlShz+t2clXYXvLOzDID+Jyqq71n4rcV0WYdBnpz1f0vBWPSoYo12zAKHXx
N67StFAxzsu+twD0AwJRzwB7seuCxVZrV3Qua/s0achWYcfMSV7ymvXcNCiZuFRU
JJTQ9sbzJWBA8cpHml3p/OJQDAyjWqa/8sDJZmT7enINsvniF+IXraY2AuNICaHo
QiESh6J4rDDJWaWju/cWJzwZM37W2yVQ4fPftVG9y8hOUvdTehvEw2tSdjHpKBjD
70ozZ9+beJXTQQLOuXW0ytxKeQEitTB3dD7YjRyS/aW829fRLGunH6cdhDik+jkO
nQIDAQAB
-----END PUBLIC KEY-----
param1: value1
param2: value2
[user@srv]$
anonymous
()
Ответ на: комментарий от d_a

ещё никто не предложил написать программу на пыхтонге

Только brainfuck, только хардкор.

no-such-file ★★★★★
()

Как-то так.

root@debian:~# printf "1\n2\n3\n4\n5" > 1
root@debian:~# sed '/2/a -----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2szClAV/gGLVvxRWmwdf\nS+vEOvlShz+t2clXYXvLOzDID+Jyqq71n4rcV0WYdBnpz1f0vBWPSoYo12zAKHXx\nN67StFAxzsu+twD0AwJRzwB7seuCxVZrV3Qua/s0achWYcfMSV7ymvXcNCiZuFRU\nN67StFAxzsu+twD0AwJRzwB7seuCxVZrV3Qua/s0achWYcfMSV7ymvXcNCiZuFRU\nQiESh6J4rDDJWaWju/cWJzwZM37W2yVQ4fPftVG9y8hOUvdTehvEw2tSdjHpKBjD\n70ozZ9+beJXTQQLOuXW0ytxKeQEitTB3dD7YjRyS/aW829fRLGunH6cdhDik+jkO\nnQIDAQAB\n-----END PUBLIC KEY-----' 1
1
2
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2szClAV/gGLVvxRWmwdf
S+vEOvlShz+t2clXYXvLOzDID+Jyqq71n4rcV0WYdBnpz1f0vBWPSoYo12zAKHXx
N67StFAxzsu+twD0AwJRzwB7seuCxVZrV3Qua/s0achWYcfMSV7ymvXcNCiZuFRU
N67StFAxzsu+twD0AwJRzwB7seuCxVZrV3Qua/s0achWYcfMSV7ymvXcNCiZuFRU
QiESh6J4rDDJWaWju/cWJzwZM37W2yVQ4fPftVG9y8hOUvdTehvEw2tSdjHpKBjD
70ozZ9+beJXTQQLOuXW0ytxKeQEitTB3dD7YjRyS/aW829fRLGunH6cdhDik+jkO
nQIDAQAB
-----END PUBLIC KEY-----
3
4
5

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

Да блин. Одну строчку два раза воткнул:

sed '/2/a -----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2szClAV/gGLVvxRWmwdf\nS+vEOvlShz+t2clXYXvLOzDID+Jyqq71n4rcV0WYdBnpz1f0vBWPSoYo12zAKHXx\nN67StFAxzsu+twD0AwJRzwB7seuCxVZrV3Qua/s0achWYcfMSV7ymvXcNCiZuFRU\nJJTQ9sbzJWBA8cpHml3p/OJQDAyjWqa/8sDJZmT7enINsvniF+IXraY2AuNICaHo\nQiESh6J4rDDJWaWju/cWJzwZM37W2yVQ4fPftVG9y8hOUvdTehvEw2tSdjHpKBjD\n70ozZ9+beJXTQQLOuXW0ytxKeQEitTB3dD7YjRyS/aW829fRLGunH6cdhDik+jkO\nnQIDAQAB\n-----END PUBLIC KEY-----' 1

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

Такое дело. У меня примерно так - sed -i «/2/a ${PUBLIC_KEY}» config.conf. Я правильно понимаю, что проблемы с «\n» у меня из-за двойных кавычек? Но у меня интерполяция, и она мне нужна.

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

Или единственный разумный выход, сделать такую некрасивую вещь? echo $PUBLIC_KEY > pk.pub sed -i '/2/a pk.pub' config.conf

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

У меня вот так работает:

root@debian:~# t="-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2szClAV/gGLVvxRWmwdf\nS+vEOvlShz+t2clXYXvLOzDID+Jyqq71n4rcV0WYdBnpz1f0vBWPSoYo12zAKHXx\nN67StFAxzsu+twD0AwJRzwB7seuCxVZrV3Qua/s0achWYcfMSV7ymvXcNCiZuFRU\nJJTQ9sbzJWBA8cpHml3p/OJQDAyjWqa/8sDJZmT7enINsvniF+IXraY2AuNICaHo\nQiESh6J4rDDJWaWju/cWJzwZM37W2yVQ4fPftVG9y8hOUvdTehvEw2tSdjHpKBjD\n70ozZ9+beJXTQQLOuXW0ytxKeQEitTB3dD7YjRyS/aW829fRLGunH6cdhDik+jkO\nnQIDAQAB\n-----END PUBLIC KEY-----"
root@debian:~# sed "/2/a $t" 1
1
2
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2szClAV/gGLVvxRWmwdf
S+vEOvlShz+t2clXYXvLOzDID+Jyqq71n4rcV0WYdBnpz1f0vBWPSoYo12zAKHXx
N67StFAxzsu+twD0AwJRzwB7seuCxVZrV3Qua/s0achWYcfMSV7ymvXcNCiZuFRU
JJTQ9sbzJWBA8cpHml3p/OJQDAyjWqa/8sDJZmT7enINsvniF+IXraY2AuNICaHo
QiESh6J4rDDJWaWju/cWJzwZM37W2yVQ4fPftVG9y8hOUvdTehvEw2tSdjHpKBjD
70ozZ9+beJXTQQLOuXW0ytxKeQEitTB3dD7YjRyS/aW829fRLGunH6cdhDik+jkO
nQIDAQAB
-----END PUBLIC KEY-----
3
4
5
Надо просто текст привести к такому виду.

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

К примеру, вот так:

printf "123\n321" > 2
t=$(cat 2 | sed ':a;N;$!ba;s/\n/\\n/g')
echo $t

alestro
()
sed -e '$a \
-----BEGIN PUBLIC KEY-----\
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2szClAV/gGLVvxRWmwdf\
S+vEOvlShz+t2clXYXvLOzDID+Jyqq71n4rcV0WYdBnpz1f0vBWPSoYo12zAKHXx\
N67StFAxzsu+twD0AwJRzwB7seuCxVZrV3Qua/s0achWYcfMSV7ymvXcNCiZuFRU\
JJTQ9sbzJWBA8cpHml3p/OJQDAyjWqa/8sDJZmT7enINsvniF+IXraY2AuNICaHo\
QiESh6J4rDDJWaWju/cWJzwZM37W2yVQ4fPftVG9y8hOUvdTehvEw2tSdjHpKBjD\
70ozZ9+beJXTQQLOuXW0ytxKeQEitTB3dD7YjRyS/aW829fRLGunH6cdhDik+jkO\
nQIDAQAB\
-----END PUBLIC KEY-----' filename


\ в конце строк. Но в файл можно было просто так:

echo '-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2szClAV/gGLVvxRWmwdf
S+vEOvlShz+t2clXYXvLOzDID+Jyqq71n4rcV0WYdBnpz1f0vBWPSoYo12zAKHXx
N67StFAxzsu+twD0AwJRzwB7seuCxVZrV3Qua/s0achWYcfMSV7ymvXcNCiZuFRU
JJTQ9sbzJWBA8cpHml3p/OJQDAyjWqa/8sDJZmT7enINsvniF+IXraY2AuNICaHo
QiESh6J4rDDJWaWju/cWJzwZM37W2yVQ4fPftVG9y8hOUvdTehvEw2tSdjHpKBjD
70ozZ9+beJXTQQLOuXW0ytxKeQEitTB3dD7YjRyS/aW829fRLGunH6cdhDik+jkO
nQIDAQAB
-----END PUBLIC KEY-----' >> filename

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