
Почему эта команда sed не удаляет пустые строки?
sed -e 's/\r//g' -e '/^{$/d' -e '/^}$/d' -e ':begin;$!N;/^state-text: {[[:space:]]\n/s/\n//;tbegin;P;D' -e "s/'/''/g" -e '/^$/d' <<< $myvar
Эта команда работает отлично, за исключением последней части -e '/^$/d' для удаления пустых строк, которая, похоже, вообще ничего не делает. Вот пример моего контента:
begin dump
Ctrl_ID:100
Это тот же контент, который просматривается с помощью cat -A
begin dump$
$
Ctrl_ID:100$
Проверка пустой строки с помощью шестнадцатеричного редактора показывает, что она содержит только один символ с шестнадцатеричным значением.
0A
В конце каждой строки находится абсолютно одинаковый код.
Я не понимаю, что здесь происходит.
^$
должно совпадать, не так ли?
решение1
Попробуйте это (пустая строка теперь находится на первой позиции):
sed -e '/^$/d' -e 's/\r//g' -e '/^{$/d' -e '/^}$/d' -e ':begin;$!N;/^state-text: {[[:space:]]\n/s/\n//;tbegin;P;D' -e "s/'/''/g" <<< $myvar
Часть, которая отвечает за неработающий метод удаления пустой строки, это:
-e ':begin;$!N;/^state-text: {[[:space:]]\n/s/\n//;tbegin;P;D'
углубляясь...
D удаляет содержимое пространства шаблонов до первой новой строки (или до конца, если новой строки нет) и начинает новый цикл. Последнее означает, что любые команды, которые идут после D в программе sed, не будут выполнены, если выполняется сама D.
отздесь