Я видел несколько ответов для удаления одной строки с помощью sed или grep, но мне нужно искать строку, удалить ее и 2 исходящие строки. Например, в файле ~/.profile у меня есть строки вроде:
#Set environment variable
export NAME=value
# (blank line here)
Поэтому я хотел бы поискать #Set environment variable и удалить его, а затем удалить следующую строку export NAME=variable (содержимое не имеет значения) и следующую пустую строку. Имена переменных export являются динамическими, но комментарий всегда будет одним и тем же. Могут быть другие переменные export без вышеуказанного комментария, которые я не хочу удалять.
Как это сделать?
Это очень легко сделать со стандартной командой delete sed:
cp ~/.profile ~/.profile.bak
sed '/#Set environment variable/,+2 d' <~/.profile.bak >~/.profile
Будьте осторожны с вашим ~ / .profile
Хотя ваш вопрос заставляет задуматься, что вы ищете способ командной строки для этого, если бы я был в вашей ситуации и хотел сделать это только для одного или двух файлов, я бы использовал emacs. [ ! d0]
emacs имеет возможность изучать последовательность нажатий клавиш, а затем повторять их столько раз, сколько вы хотите. Поэтому в вашем случае я бы открыл ~/.profile в emacs, а затем набрал
C-x ( C-s #Set environment variable C-a C-k C-k C-k C-x )
[который, на словах, делает это: Cx (означает «начните изучать этот "; Cs означает« поиск », поэтому мы ищем переменную среды #Set, а затем« Ca »означает« назад к началу строки », а три Ck означают« удалить эту строку »и, наконец, Cx) означает «перестаньте это изучать».]
После того, как эти команды были введены один раз, emacs удалил три строки, но также научился делать это наизусть, поэтому теперь вы можете ввести
C-x e
, и он сделает это снова или
C-u 100 C-x e
, и он сделает это 100 раз (или остановится, когда он сможет
Преимущество использования emacs заключается в том, что вы можете видеть, что ваши изменения происходят «вживую», а для параноидального человека, подобного мне, который боится что один sed typo может удалить много вещей, которые я не хотел удалить, это делает меня намного счастливее [в тот момент, когда в emacs все пошло не так, вы можете просто вернуться назад и исправить t кромка с C-_].