2016-03-07 3 views
0

Файл имеет следующие строки:Найдите тест (a1, a2, a3 ...) и замените его тестом (a [1], [2], [3] ...) в файле

test(a1,a2,a3....) 

Количество элементов внутри test() может варьироваться. Мы должны заменить его

test(a[1],a[2],a[3],....) 

Иногда, это может иметь несколько операторов тестов в файле:

test(x1,x2,x3) 
test(b1,b2,b3) 

Мы должны заменить элементы в test().

Пример вывода для этого будет:

test(x[1],x[2],x[3]) 
test(b[1],b[2],b[3]) 

Остальная часть тестового файла должен остаться без изменений. Необходимо искать только ключевое слово test и заменить его выше.

Вход:

test(a1,a2,a3) 

Выход:

test(a[1],a[2],a[3]) 
+1

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

ответ

0

Я думаю, что это делает то, что вы хотите:

cat $INPUT_FILE \ 
| sed -e 's/test($/test(/' \ 
    -e 's/test(\([^)]*\))/test(\ 
\1\ 
)/g' \ 
| sed -e '/test($/{ 
    :Loop; 
    h; 
    s/^.*$//; 
    N; 
    s/\([A-Za-z_][A-Za-z_]*\)\([0-9][0-9]*\)/\1[\2]/g; 
    N; 
    H; 
    x; 
    s/\n//g; 
    /test($/ b Loop; 
}' \ 
    -e 's/test($/test(/' 

С этим входом:

nothing 
nothing 
test(b,c,d) 
test(a1,a2,a3) test(x1,y2,z3) foo test(b1,b3,b4) 
foo test(a1, a2, a3) bar 
foo test bar 
test() 
test(
a1, a2, a3 
) 

Производит этот выход. Обратите внимание на последний случай - я не обрабатываю разделительные линии.

nothing 
nothing 
test(b,c,d) 
test(a[1],a[2],a[3]) test(x[1],y[2],z[3]) foo test(b[1],b[3],b[4]) 
foo test(a[1], a[2], a[3]) bar 
foo test bar 
test() 
test(
a1, a2, a3 
) 
0

не было бы проще просто ограничить замену на линиях, которые соответствуют шаблону test(..)

Это может сделать таким образом:

$ cat file1 
abcd 
test(x,y,z) 
test(a1,a2,a3) test(a1,a2,a3) hello 
test(a1,a3,a5) 
abc test(a1, a2, a3) efgh 
abcde test bar 
test() 
test(
a1, a2, a3 
) 
test() test(a45, b67,c67, he7) 
$ sed -r '/test\(([a-zA-Z]+[0-9]+,?\s*)*\)/ s/([a-zA-Z]+)([0-9]+)(,?)(\s*)/\1\[\2\]\3\4/g' file1 
abcd 
test(x,y,z) 
test(a[1],a[2],a[3]) test(a[1],a[2],a[3]) hello 
test(a[1],a[3],a[5]) 
abc test(a[1], a[2], a[3]) efgh 
abcde test bar 
test() 
test(
a1, a2, a3 
) 
test() test(a[45], b[67],c[67], he[7]) 
$ 
Смежные вопросы