Как вставить переменное содержимое с помощью команды sed - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть сценарий оболочки (. sh), и я пытаюсь вставить содержимое файла в другой файл, используя следующие команды, но выдает ошибку "sed: -e выражение # 1, char 28: unknown опция `s '":

filename="/home/user1/filename.txt"
contents=$(du -sh /var/log/test.log)
hostname > $filename
sed -i "/test_string/ s/$/, $contents" $filename

Я не могу понять, где находится основная проблема. Может кто-нибудь помочь, пожалуйста?

Пример:

filename = /home/user1/filename.txt

hostname = server1.mydomain.com

Таким образом, содержание $filename равно server1.mydomain.com после выполнения hostname > $filename.

Вывод команды du -sh /var/log/test.log, скажем, 1.3M /var/log/test.log

Таким образом, выполнение sed -i "/mydomain.com/ s/$/, $contents" $filename должно обновить содержимое следующего имени файла до:

server1.mydomain.com, 1.3M /var/log/test.log

Но, как я упоминал выше, выдает ошибку.

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

попробуйте

sed -i  "s#\$#, ${contents}#g" 

Демо:

$cat file.txt 
server1.mydomain.com
$echo $contents 
1.3M /var/log/test.log
$sed -i  "s#\$#, ${contents}#g"  file.txt 
$cat file.txt 
server1.mydomain.com, 1.3M    /var/log/test.log
$

sed использование команды s#pattern to search#pattern/String replacement#occurence

0 голосов
/ 16 апреля 2020

Это проще сделать с perl или другим языком, чтобы избежать проблем с символами в вашей переменной, вызывающих sed ошибки разбора:

contents=$(du -sh /var/log/test.log) perl -pi -e '$_ .= ", $ENV{contents}" if /test_string/' "$filename"

Или использование ed до ed это файл, полностью исключая переменную $contents:

ed -s "$filename" <<'EOF'
/test_string/a
,<space>
.
r !du -sh /var/log/test.log
.-2,.j
w
EOF

Замените <space> буквальным пробелом.

Этот crypti c -при первом наборе команд сначала перемещается на первую строку, соответствующую регулярному выражению test_string, затем a добавляет строку ,<space> после нее, затем r завершает вывод команды du и вставляет его в строку после этого, и, наконец, j объединяет эти три строки в одну и w переводит измененный файл обратно на диск.

(Предполагается, что du вызов вернет только одну строку.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...