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