#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 могут не работать!