找到测试(a1,a2,a3 ......)并将其替换为文件

时间:2016-03-07 22:19:45

标签: awk sed

该文件包含以下行:

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])

2 个答案:

答案 0 :(得分: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
)

答案 1 :(得分: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])
$