Попытка удалить определенные строки в диапазоне с помощью sed

в большой файл, мне нужно редактировать текст и удалять комментарии внутри определенного диапазона. Для этого упрощенного примера предположим, что диапазон начинается с _start_ и заканчивается в _end_.

Я могу редактировать текст с помощью команды:

sed -i -r "/_start_/,/_end_/ s/SearchText/ReplaceText/" FileName

обратите внимание на следующее (и дайте мне знать, конечно, если какие - либо из моих заявлений являются неточными или ошибочными):

  • я -i чтобы он редактировал "FileName" на месте, а не писать в другой файл.
  • я -r чтобы он распознавал расширенные регулярные выражения (которые не показаны в упрощенном примере выше, но которые, похоже, работают правильно).
  • я использовал двойные кавычки, чтобы он правильно обрабатывал переменные (также не показано в упрощенном примере выше, но также работает, как ожидалось).

эта команда выше делает именно то, что я ожидаю от нее. Поэтому я перешел к второй шаг моего процесса: очень похожая команда для удаления строк комментариев в этом диапазоне:

sed -i -r "/_start_/,/_end_/ /^#/ d" FileName

это, однако, не имеет никакого эффекта: строки, которые начинаются с # не удалены. Действительно, когда я выполняю эту команду в одиночку, абсолютно ничего в моем файле не изменяется или удаляется-ни внутри диапазона, ни в другом месте.

в моих поисках на этом сайте и в других местах я нашел много инструкций по удалению строк с помощью sed (инструкции, которые я думаю, что я правильно следовать) -- но ничего о неудаче, такой как я испытываю.

кто-нибудь может посоветовать мне, что я делаю неправильно здесь?

Я очень новичок в среде UNIX / Linux, поэтому я определенно открыт для альтернативных предложений о том, как справиться с этой проблемой. Но просто чтобы удовлетворить мое разочарование, я хотел бы знать, что не так с моей командой sed выше.

2 ответов


лучшим источником информации часто является man-страница. Вы можете добраться до него с помощью команды man sed.

d принимает диапазон адресов в соответствии с man-страницей. Адрес может быть номером,/ regexp / или рядом других вещей. Диапазон адресов - это один или два адреса, разделенные запятыми. Вы пытались использовать диапазон адресов, а затем адрес.

как указал 1_CR, вы можете работать с помощью блока вместо этого:

sed -i -r "/_start_/,/_end_/ {/^#/ d}" FileName

блок принимает диапазон адресов, и каждая команда снова принимает диапазон адресов, поэтому вы можете комбинировать регулярные выражения.


вам нужно изменить

sed -i -r "/_start_/,/_end_/ /^#/ d" FileName

to

sed -i -r "/_start_/,/_end_/{/^#/d}" FileName