2014-01-10 4 views
0

Я хотел бы использовать sed для замены, но не путем поиска того, что заменить.sed частичная замена или переменная

Позвольте мне объяснить. Первоначально у меня есть значение переменной по умолчанию.

VARIABLE="DEFAULT" 

я могу сделать, чтобы заменить СЭД DEFAULT с тем, что я хочу, но тогда я должен был бы поставить DEFAULT назад, когда я все сделал. Это связано с тем, что данные, хранящиеся в VARIABLE, уникальны для пользователя. Я бы хотел использовать sed для поиска чего-то другого, кроме того, что нужно заменить. Например, найдите VARIABLE = "and" и замените что-то между ним. Таким образом, он постоянно обновляется, и нет необходимости перезагружать VARIABLE.

Это, как я это делаю в данный момент:

Я называю сценарий и передать аргумент

./script 123456789 

Внутри скрипта, это то, что происходит:

sed -i "s%DEFAULT%$1%" file_to_modify 

Это заменяет

VARIABLE="DEFAULT" 

с

VARIABLE="123456789" 

Было бы хорошо, если бы я не должен искать «по умолчанию», потому что тогда я бы не сбросить ПЕРЕМЕННОЙ в конце сценария.

ответ

1
sed -r 's/VARIABLE="[^"]*"/VARIABLE="123456789"/' file_to_modify 

Или, в более общем плане:

sed -r 's/VARIABLE="[^"]*"/VARIABLE="'"$1"'"/' file_to_modify 

Оба выше использовать регулярное выражение, которое выглядит для «Variable =„ничего-на-все“» и заменяет его в первом примере выше 'VARIABLE = "123456789" или, во втором, "VARIABLE =" $ 1 ", где« $ 1 »является первым аргументом для вашего скрипта. Ключевым элементом является [^"]. Это означает любой символ, отличный от двойной кавычки. [^"]* означает любое количество символов, кроме двойной кавычки. Таким образом, мы заменяем все, что было в двойных кавычках раньше, "[^"]*", с нашим новым значением "123456789" или, во втором случае, "$1".

Второй случай немного сложный. Мы хотим заменить $1 на выражение, но выражение само по себе в одинарных кавычках. Внутри одиночных кавычек bash не будет заменять $1. Таким образом, СЭД команда разбита на три части:

# spaces added for exposition but don't try to use it this way 
's/VARIABLE="[^"]*"/VARIABLE="' "$1" '"/' 

Первая часть находится в одинарных кавычках и Баш передает его в буквальном смысле СЭД. Вторая часть находится в двойных кавычках, поэтому bash будет зависеть от значения `$` `. Третья часть находится в одинарных кавычках и передается в sed буквально.

MORE: Вот простой способ проверить этот подход в командной строке без зависимости от каких-либо файлов:

$ new=1234 ; echo 'VARIABLE="DEFAULT"' | sed -r 's/VARIABLE="[^"]*"/VARIABLE="'"$new"'"/' 
VARIABLE="1234" 

Первая строка выше команда запуска в командной строке ($). Второй - это результат выполнения команды.

+0

Можете ли вы добавить небольшое объяснение, пожалуйста? – Atomiklan

+0

Я попробовал sed -r '/ VARIABLE = "([^"] *) "/ VARIABLE =" $ 1 "/' file_to_modify, и скрипт зависает – Atomiklan

+0

Вам нужны скобки вокруг скобок? Я думаю, вы также можете использовать' 's/VARIABLE = "[^"] * "/ VARIABLE =" 123456789 "/'' –

Смежные вопросы