У меня есть это:
sed -i '/^$/d' temp_spec.rb
который удаляет пустые строки и работает хорошо. Как я могу сделать это только для строк 5-999 (или в идеале от 5 до конца файла).
Я старался:
sed -n5,999 -i '/^$/d' temp_spec.rb
sed '5,999!d/^$/d' temp_spec.rb
но ни один не работал (без ошибок).
Ответы:
Если вы хотите удалить все пустые строки, начиная со строки 5 и оставить строки от 1 до 4, вы можете использовать
Это
{
оператор группировки, поэтому первая команда5,${
означает «от строки 5 до конца input ($
) выполнить следующие команды до совпадения}
». Команды между{
и}
могут снова иметь префикс по адресам, поэтому внутренняя команда/^$/d
означает «если между строкой begin (^
) и end ($
) строки ничего нет , удалите ее». Команды Sed могут быть разделены;
. (Это плохо документированная особенность sed. Она поддерживается большинством реализаций sed, но не полностью переносима .) Как отметил Хауке,;
after{
не обязателен; один , прежде чем}
требуется, однако.Если вы хотите удалить все пустые строки, начиная со строки 5, а также удалить строки с 1 по 4, это проще:
источник
;
.;
.Еще один вариант использования awk:
источник
Изменить 1:
Я должен объяснить это, таким образом ...
Это излишне сложно. Я не знал, что диапазоны адресов разрешены в пределах
{}
. Поэтому мне пришлось выразить «удалить пустые строки» по-другому. Основная команда -t
это способ sedif ... then
.T
было бы проще, но доступно только для GNU sed. Я цитирую справочную страницу:Я злоупотребляю знаменитой
s
командой. Он не должен ничего заменять, а только проверяет, пуста ли строка. Таким образом, он заменяет пустую строку пустой строкой (в качестве замены может использоваться что угодно, поскольку строка в любом случае удаляется).Если
s
произведена «замена», то строка пуста. В этом случае командаd
должна быть выполнена. Иначе ничего не поделаешь. Какt
не прыгает в случаеs
действия мне нужна командаb
перехода, чтобы перейти к концу скрипта.: label
являются целями филиала. Какgoto
тогда, в темные века (когда был изобретен sed ... te-hee).Другой вариант -
s
«заменить» все непустые строки,s
упрощая более сложную, но остальную часть команды:^..*$
означает «непустая строка» и\1
означает «содержимое первых скобок».источник