该文件包含以下行:
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])
答案 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])
$