sed: замена текста, если следующая строка не начинается с }

#replace #sed

#заменить #sed

Вопрос:

Я хотел бы заменить ; на , если следующая строка не начинается с } и если следующая строка не пуста.

если следующая строка начинается с } или она пуста, то ; должна быть удалена.

например

 struct Point {
    float x;   
    float y;
};
  

должно быть изменено, как показано ниже

 type something{
type record Point{
 c_float x,
 c_float y
};
}
  

Все остальные изменения через sed работают, кроме этого ‘;’ на ‘,’ и у меня действительно больше нет идей, как продолжить с этим .. 🙁

Ответ №1:

С awk вместо sed:

 echo 'struct Point {
    float x;
    float y;
};' |
awk '
    $1 == "};" {
        print prev
        print
        print "}"
        in_struct = 0
    }
    in_struct {
        if (prev) {print prev ","}
        prev = $0
        sub(/; *$/, "", prev)
        sub(/float/, "c_amp;", prev)
    }
    $1 == "struct" {
        print "type something {"
        $1 = "type record"
        print
        prev = ""
        in_struct = 1
    }
'
  

выводит

 type something {
type record Point {
    c_float x,
    c_float y
};
}
  

Ответ №2:

 [DoD@MBP-13~/temp] cat file
struct Point {
     float x;   
     float y;
};   


[DoD@MBP-13~/temp] sed ' /^}|^$/ s/;// ' file | sed 'N ; /}/! s/;/,/ ' | sed 'N ; /}/ s/;//'
struct Point {
    float x,   
    float y
}
  

Первая итерация sed ищет строки, начинающиеся с «}» или пустых строк, и удаляет «;», а вторая итерация sed загружает новую строку в буфер, проверяет, не содержит ли она «}», затем заменяет «;» на «,». Третья итерация ищет «}» и удаляет «;».

Ответ №3:

Это может сработать:

 a="SOMETHING"
sed -r '/^structs*S*s*{/,/^};/s/^structs*(S*)s*{/type '"$a"'{ntype record 1{/;s/^};/amp;n}/' input_file |
sed -r '/^type '"$a"'{/,/^}/{//b;/^type/b;/^};/!N;/.n/{s/s*/amp;c_/;/n(};|$)/{s/;//;ta};{s/;/,/}};:a;P;D};P;D'
  

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

Кстати, это было сделано GNU sed, другие sed могут не работать!