Сед с су неправильно интерпретирует сед отрицание - PullRequest
0 голосов
/ 28 сентября 2018

Это упрощенная версия моей актуальной проблемы.Вот мой файл test.data

test.data
=========
PROD SEARCH_URL = "google.com" db name "customers"
TEST SEARCH_URL = "google.com" db name "emp"

Для всех строк, содержащих «ТЕСТ», я хочу изменить поисковый домен с «google.com» на «bing.com»

НижеКоманда sed прекрасно работает для достижения этой цели:

sed -rin '/PROD/!s/bing.com/google.com/' test.data

Но так как моя тестовая среда настроена, мне нужно запустить команду sed, используя "su" как:

su root "sed -rin '/PROD/!s/bing.com/google.com/' test.data"

Иэто приводит к ошибке

-bash: !s/bing.com/google.com/': event not found

Из других вопросов, связанных с переполнением стека, я попытался: сбежать!и заключив его в ''.Кажется, ничего не работает

Также пробовал "установить + H", как показано ниже, и это не работает:

su root "set +H && sed -rin '/PROD/!s/bing.com/google.com/' test.data"

Чего мне не хватает?

1 Ответ

0 голосов
/ 28 сентября 2018

Похоже, что интерпретация исторического персонажа ! в действительности выполняется оболочкой current , что означает, что его отключение в оболочке, созданной su, слишком поздно.

Кроме того, строка:

set +H && su ...

не поможет, поскольку похоже, что строка вся подвержена изменениям истории, как только вы нажмете ENTER , до set +H вступает в силу.Даже set +H ; su ..., похоже, не помогает в этом.

Однако следующее действительно работает, отключая историю перед строкой, которая будет его использовать:

set +H
su ...
set -H

Подробнее см. Следующую расшифровку:

pax$ cat test.data
PROD google.com
ABCD google.com
DEFG google.com

pax$ set +H
pax$ su root -c "sed -rin '/PROD/!s/google/bing/' test.data"
Password: <blah blah blah>

pax$ cat test.data
PROD google.com
ABCD bing.com
DEFG bing.com

Существует также * способ сделать это с помощью инструмента, который не вообще потребовать символ ! (если по какой-то причине вышеприведенное не работает для вас).

В соответствии со следующей расшифровкой текста, awk будет хорошо работать (вам просто нужно подражатьsed редактирование на месте:

pax$ cat test.data
PROD google.com
ABCD google.com
DEFG google.com

pax$ su root -c "awk '/PROD/{gsub(/google/,\"bing\")}1' test.data >xx && mv xx test.data"
Password: <blah blah blah>

pax$ cat test.data
PROD google.com
ABCD bing.com
DEFG bing.com

Вы должны экранировать " символов в строке из-за внешних кавычек ", но это примерно так же просто, какэто можно сделать, все еще соблюдая первоначальные намерения (насколько я понимаю).

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