GRUB не отображается во время двойной загрузки.

Мой ноутбук - Lenovo G50-70. Я установил ubuntu и он хорошо загружался с GRUB, но окна имели ошибку BCD. После исправления ошибки BCD он сразу загружается в окна 10, не показывая GRUB, и я не могу загрузиться в ubuntu. Как вернуть GRUB?

-121--893077- Сценарий Bash для обновления BIND ACL - нежелательный символ Я пытаюсь обновить файл на сервере, где новая строка должна иметь одну вкладку в передней части, но новую, чтобы разбить сценарий и sed и продолжать получать нежелательный символ в передней части. Это...

Я пытаюсь обновить файл на сервере, на котором новая строка должна иметь одну вкладку в передней части, но новую, чтобы сделать скрипт и sed и продолжать получать нежелательный символ в передней части.

Это команда sed:

sed -i "/acl \"trusted\" {/a&\t$ACL_IP;    # $SRV_HOST_NAME" $ACL_CONF_FILE

In the results I get :
&       192.12.12.12;    # SERVER
        192.13.13.13;    # SERVER1
        192.14.14.14;    # SERVER2

Instead of :
       192.12.12.12;    # SERVER
       192.13.13.13;    # SERVER1
       192.14.14.14;    # SERVER2

Я также попробовал следующее, но получить неизвестную ошибку команды:

sed -i "/acl \"trusted\" {/$ACL_IP    # $SRV_HOST_NAME;\r\n\tacl \"trusted\" {/" $ACL_CONF_FILE

Я также попытался:

sed -i "/acl \"trusted\" {/a/\t$ACL_IP;    # $SRV_HOST_NAME" $ACL_CONF_FILE

Но получите:

/       192.12.12.12;    # SERVER

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

2
задан 22 January 2021 в 19:33

1 ответ

Итак, вы пытаетесь использовать команду (GNU extension) a text для a ppend text после совпадения. Однако ваш текст в этом случае начинается с символа табуляции, представленного в sed escape-последовательностью \ t .

К сожалению, существует также (совместимая с POSIX) форма команды a ppend, в которой символ обратной косой черты отделяет команду a от текста . Поэтому, когда вы пишете a \ t , он добавляет литерал t . Вы «исправили» это, поместив дополнительный символ (сначала & , затем позже / ), чтобы отделить обратную косую черту от команды a , но это только вызвало те добавляются буквально.

Чтобы устранить двусмысленность, вам нужно передать команду как a \\ t . К сожалению, поскольку вы используете двойные кавычки вокруг всего выражения sed (чтобы разрешить раскрытие переменных оболочки), оболочка расширит \\ на \ ; чтобы передать \\ , вам нужно избежать обеих обратных косых черт:

sed "/acl \"trusted\" {/a\\\\t$ACL_IP;    # $SRV_HOST_NAME"

В качестве альтернативы, заключите в одинарные кавычки части, которые не нуждаются в расширении оболочки:

sed '/acl "trusted" {/a\\t'"$ACL_IP;    # $SRV_HOST_NAME"

Другой вариант - заменить escape-последовательность \ t буквальной табуляцией, составленной с помощью Ctrl + V , затем TAB . Вы по-прежнему должны использовать форму команды a \ , поскольку расширение GNU форма текста игнорирует начальные пробелы.


В качестве альтернативы (и, возможно, более аккуратно) вы можете использовать команду r для чтения строки в формате printf из стандартного ввода:

printf '\t%s;    # %s\n' "$ACL_IP" "$SRV_HOST_NAME" |
  sed -i '/acl "trusted" {/r/dev/stdin' "$ACL_CONF_FILE"
3
ответ дан 18 March 2021 в 23:41

Другие вопросы по тегам:

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