двойная кавычка внутри переменной в Sed

В моем случае я только что обновил systemd, и любая команда systemctlне выполнялась:

# systemctl daemon-reexec
Failed to reload daemon: Access denied
# systemctl status
Failed to read server status: Access denied

Однако, согласно справочной странице init, вы можете сделать то же самое, отправив SIGTERMдемону, работающему как PID 1, что сработало:

kill -TERM 1

Это перезагрузило демон, после чего все команды systemctlснова заработали.

0
23.03.2021, 16:09
1 ответ

Не вводить предоставленные пользователем -данные в скрипт sed. Это приносит больше проблем, чем пользы, и во многих случаях может быть дырой в безопасности (, особенно с GNU sed, которая допускает выполнение произвольного кода ). Помните, что вставка $textв замещающую часть команды s///фактически изменяет ваш сценарий sed, используя любую строку $text.

Если вам просто нужно изменить первую строку на некоторую фиксированную строку, используйте вместо нее awk:

cp results.txt results.txt.bak &&
awk -v value="$text" 'NR == 1 { $0 = value }; 1' results.txt.bak >results.txt

Тестирование:

$ text='<string name="app_mod_app_crowdin_1">crowdin one es</string>'
$ cat results.txt
line 1
line 2
line 3
$ cp results.txt results.txt.bak && awk -v value="$text" 'NR == 1 { $0 = value }; 1' results.txt.bak >results.txt
$ cat results.txt
<string name="app_mod_app_crowdin_1">crowdin one es</string>
line 2
line 3

Код awkпросто заменяет текущую строку заданным текстом if NR == 1, т.е. если это первая строка файла. Замыкающий 1приводит к печати всех строк, независимо от того, изменены они или нет.

0
28.04.2021, 22:57

Теги

Похожие вопросы