sed: замена текста, если следующая строка не начинается с} - PullRequest
0 голосов
/ 04 ноября 2011

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

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

например

struct Point {
    float x;   
    float y;
};

следует изменить, как показано ниже

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

Все остальные изменения с помощью sed работают, кроме этого ';на ',' и у меня действительно больше нет идей, как продолжать это ..: (

Ответы [ 3 ]

1 голос
/ 05 ноября 2011
[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 загружает новую строку в проверку буфера, если она не содержит "}", а затем подставляет ";"к ",".Третья итерация ищет "}" и удаляет ";".

1 голос
/ 05 ноября 2011

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

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

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

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

1 голос
/ 04 ноября 2011

С 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_&", 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
};
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...