Удаление нескольких строк из файла при обнаружении текста

Я видел несколько ответов для удаления одной строки с помощью sed или grep, но мне нужно искать строку, удалить ее и 2 исходящие строки. Например, в файле ~/.profile у меня есть строки вроде:

#Set environment variable
export NAME=value
# (blank line here)

Поэтому я хотел бы поискать #Set environment variable и удалить его, а затем удалить следующую строку export NAME=variable (содержимое не имеет значения) и следующую пустую строку. Имена переменных export являются динамическими, но комментарий всегда будет одним и тем же. Могут быть другие переменные export без вышеуказанного комментария, которые я не хочу удалять.

Как это сделать?

1
задан 17 June 2015 в 17:38

2 ответа

Это очень легко сделать со стандартной командой delete sed:

cp ~/.profile ~/.profile.bak
sed '/#Set environment variable/,+2 d' <~/.profile.bak >~/.profile

Будьте осторожны с вашим ~ / .profile

2
ответ дан 23 May 2018 в 19:44
  • 1
    это неправильно ... он будет слепо удалять следующие две строки после матча независимо от содержимого .... также вы можете просто использовать sed -i вместо того, чтобы делать резервную копию заранее. – heemayl 17 June 2015 в 20:05
  • 2
    @heemayl: но исходное сообщение указано "(содержимое не должно иметь значения)", по крайней мере, для "экспорта" линия. Впрочем, вы можете быть правы с пустой строкой. – ludvik02 17 June 2015 в 20:10

Хотя ваш вопрос заставляет задуматься, что вы ищете способ командной строки для этого, если бы я был в вашей ситуации и хотел сделать это только для одного или двух файлов, я бы использовал 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-_].

0
ответ дан 23 May 2018 в 19:44

Другие вопросы по тегам:

Похожие вопросы: