Я предлагаю предыдущий кормить содержимое $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.
использовать двойные кавычки для команды 'sed'. Я не могу найти оригинальный вопрос, чтобы закрыть это как дубликат ... – anishsane
Только '/' не проблема, даже '*' или все специальные метасимволы регулярных выражений будут проблемой для 'sed' – anubhava
или использовать' perl -pe 's \ \ $ $ var | #line_removed | "/tmp/k1.txt' ... – Sundeep