Переменная в команде sed - PullRequest
0 голосов
/ 01 ноября 2018

Я не могу заставить эту команду sed работать.

remote_file_path=$(tac $local_file_name | sed -nr '1,/$file_name/ d; /^\\/ { p; q }')

Если я заменяю одинарные кавычки на двойные, это прерывает остальную часть команды, и я получаю эту ошибку:

sed: -e expression #1, char 31: unterminated address regex

По сути, я использую tac для поиска файла в обратном направлении, чтобы я мог найти предыдущую строку, которая начинается с обратной косой черты, и присвоить ее переменной remote_file_path.

Спасибо

1 Ответ

0 голосов
/ 01 ноября 2018

Одинарные кавычки не раскрывают переменные. Двойные кавычки есть, но если имя файла содержит косую черту (или какой-либо другой символ, особенный для sed), оно может нарушить выражение. Вы можете использовать другой разделитель регулярных выражений (например, \=$file_name= d), но только если вы уверены, что имя файла никогда не может его содержать (или другие специальные символы sed, например, точка).

Используйте реальный язык с переменными, переменные в оболочке - это просто макросы; например, вы можете использовать Perl:

f=$file_name perl -ne 'next if 1 .. /\Q$ENV{f}/; print, last if /^\\/'
  • \Q делает все специальные символы в $ f буквальными (см. quotemeta ).
...