Попытка удалить определенные строки в диапазоне с помощью 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