Awk 找到测试(a1、a2、a3…)并在文件中用测试(a[1]、a[2]、a[3]…)替换它

Awk 找到测试(a1、a2、a3…)并在文件中用测试(a[1]、a[2]、a[3]…)替换它,awk,sed,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()
中的元素数量可能会有所不同。我们必须把它换成新的

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

我想这正是你想要的:

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
)

仅仅在与模式
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])
$

编辑您的问题,包括简明、可测试、示例输入和预期输出,以及您迄今为止尝试过的任何内容。在您的输入示例中包括您要替换的模式包括空白字符、换行符或任何您认为工具难以处理的其他内容。