2017-02-16 16 views
1

Как я могу заменить следующий текст в файл в Linux с другой линиейЗаменить текст в файл в Баше с/в строке поиска

Current:

0 22 * * * /scripts/application_folder_backup.sh >> /var/log/application_folder_backup.log 

Замена линией: #line_removed

Я пробовал использовать sed, но в моем тексте в файле уже есть/который вызывает проблемы. Я также попытался сохранить строку в переменной. Но это не работает

#!/bin/bash 

var="0 22 * * * /scripts/application_folder_backup.sh >> /var/log/application_folder_backup.log" 

sed -i -e 's/$var/#line_removed/g' /tmp/k1.txt 

выход

+0

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

+2

Только '/' не проблема, даже '*' или все специальные метасимволы регулярных выражений будут проблемой для 'sed' – anubhava

+0

или использовать' perl -pe 's \ \ $ $ var | #line_removed | "/tmp/k1.txt' ... – Sundeep

ответ

-1

Я предлагаю предыдущий кормить содержимое $var в SED сценария, чтобы избежать всех / чарсов быть \/, как:

var_esc=$(echo "$var" | sed 's/\//\\\//g') 

Но выражение sed становится очень сложным (вы должны использовать едиными цитаты, если вы не хотите удваивать цифры \, так как двойные кавычки интерпретируют также обратную косую черту.

Еще одна вещь, которая могла бы упростить выражение, - это использовать возможность изменения разделителя регулярных выражений (с использованием другого символа б Egin его), как в:

var_esc=$(echo "$var" | sed 's:/:\/:g') 

Идея заключается в том, чтобы перед заменой переменной $var, чтобы избежать всех возможных interferring символов вы можете иметь (вы не знаете, априорно, если там будет, как и вы используете переменную для этой цели), а затем заменить их в последней команде:

sed "s/$var_esc/#line_removed/g" 

Наконец, если вы не хотите, чтобы заменить строку, но только, чтобы удалить его, вы можете сделать что-то подобное :

sed "/$var_esc/d" 

, и это стирает все строки, которые соответствуют вашему содержимому $var_esc. (На этот раз я верю, что вы не можете изменить регулярное выражение разделителя, как / вводит соответствия линия оператора --- d это команда для удаления строки в выводе)

Другим способом удалить строку в вашем файл для прямого вызова ex и передать команду редактора в качестве входных данных:

ex file <<EOF   <-- edit "file" with the commands that follow until EOF is found. 
/$var_esc    <-- search for first occurrence of $var_esc 
d      <-- delete line 
w      <-- write file 
EOF     <-- eof marker. 
+0

Извините, это должно быть вежливо объяснить причины нисходящего потока, поскольку на вопрос был дан ответ не только, но и, похоже, это выбранный ответ. Я хочу также узнать, почему мои ответы кажутся неправильными для всех. –

1

Просто / не проблема здесь, даже * или все специальные регулярные выражения метасимволы будет проблемой для sed, поскольку она использует регулярное выражение только для шаблонов поиска.

Лучше использовать эту non-regex на основе awk команду:

awk -v var="$var" 'index($0, var) { $0 = "#line_removed" } 1' file 

#line_removed 

index функция awk использует простой текстовый поиск вместо поиска на основе регулярных выражений.

+1

хороший, вероятно, OP хочет проверить целую строку, поэтому '$ 0 == var' также является выбором – Sundeep

+0

Да действительно для точного соответствия полной строки' $ 0 == var' является правильный подход. – anubhava

+1

Спасибо всем за помощь. Решено – user230994