2

У меня есть следующий файл bash под названием "файл" (настоящий делает что-то полезное):

ed db/seeds.rb <<EOF
1,$-1d
a
123
456
.
w
q
EOF

Когда я запускаю "bash file", он не удаляет строки. Если я использую 1d вместо 1,$-1d это действительно удаляет первую строку.

Почему это не работает? Я мог бы легко обойти, но мне любопытно, почему это не работает.

2 ответа2

1

sed проще в этом случае. Выберите одно из:

sed -i -n '$p' file
sed -i '$!d' file

Ошибка вашего кода в том, что оболочка расширяет $- перед передачей скрипта в ed . Это будет работать:

# quoting the heredoc word:
ed db/seeds.rb <<'EOF'
1,$-1d
w
q
EOF
0

Проблема в том, что оболочка интерпретирует $ в команде 1,$-1d .  (В частности, в моих тестах он интерпретирует $- как набор set флагов.)  Лучший способ исправить это - заключить в кавычки или экранировать строку EOF , как в

ed db/seeds.rb <<\EOF

или же

ed db/seeds.rb <<"EOF"

В качестве альтернативы, вы можете экранировать (то есть поставить обратную косую черту) каждый $ в вашем «здесь документе».

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .