带sed的翻转数组索引

带sed的翻转数组索引,sed,Sed,我有一些java代码声明了我想要翻转的2d数组。 内容如下: zData[0][0] = 198; zData[0][1] = 198; zData[0][2] = 198; ... 我想有一个 zData[0][0] = 198; zData[1][0] = 198; zData[2][0] = 198; 所以我试着用sed来做: sed -r 's#zData[([0-9]*)][([0-9]*)]#zData[\2][\1]#g' DataSample1.java 但不幸的是

我有一些java代码声明了我想要翻转的2d数组。 内容如下:

zData[0][0] = 198;
zData[0][1] = 198;
zData[0][2] = 198;
    ...
我想有一个

zData[0][0] = 198;
zData[1][0] = 198;
zData[2][0] = 198;
所以我试着用sed来做:

sed -r 's#zData[([0-9]*)][([0-9]*)]#zData[\2][\1]#g' DataSample1.java
但不幸的是,塞德说:

sed: -e expression #1, char 43: Unmatched ) or \)
字符串“zData”可能包含某种标志或选项吗

我尝试不使用-r选项,但我有相同的消息:

sed 's#zData[\(\[\0\-\9\]\*\)][\(\[\0\-\9\]\*\)]#zData[\2][\1]#g' DataSample1.java
谢谢你的帮助

试试这个:

sed 's#\([a-zA-Z0-9_-]\+\)\(\[[^]]*\]\)\(\[[^]*]\]\)\(.*$\)#\1\3\2\4#'
它为变量名、第一个索引、第二个索引和其他索引添加四个捕获,然后切换顺序

Edit:@Sudo\u O使用扩展正则表达式的解决方案更具可读性。谢谢!但是,在某些系统上,sed-r可能不可用,因为它不是的一部分。

请尝试以下方法:

sed 's#\([a-zA-Z0-9_-]\+\)\(\[[^]]*\]\)\(\[[^]*]\]\)\(.*$\)#\1\3\2\4#'
它为变量名、第一个索引、第二个索引和其他索引添加四个捕获,然后切换顺序

Edit:@Sudo\u O使用扩展正则表达式的解决方案更具可读性。谢谢!然而,在某些系统上,sed-r可能不可用,因为它不是的一部分。

简化了:

$sed-r的/(zData)(\[[^]]+])(\[^]]+])/\1\3\2/'文件
zData[0][0]=198;
zData[1][0]=198;
zData[2][0]=198;
解释:

#匹配
(zData)#捕获我们要转换的变量名
(#启动第一个索引的捕获组
\[#开头括号转义为字面意思[
[^]]+#一个或多个无]字符,即数字
]#结束文字]不需要在这里转义。
)#结束捕获
(\[^]]+])#第二个索引的regexp与之前相同
#替换
\1\3\2#切换索引,但重新排列第二和第三捕获组
注意:将
\[^]+]
切换到对您来说更清晰的
\[[0-9]+]
,因此不要说匹配一个开始的方括号,后面跟一个或多个无结束方括号,后面跟一个结束方括号,而是说匹配一个开始的方括号,后面跟一个或多个数字,后面跟一个结束方括号

简化:

$sed-r的/(zData)(\[[^]]+])(\[^]]+])/\1\3\2/'文件
zData[0][0]=198;
zData[1][0]=198;
zData[2][0]=198;
解释:

#匹配
(zData)#捕获我们要转换的变量名
(#启动第一个索引的捕获组
\[#开头括号转义为字面意思[
[^]]+#一个或多个无]字符,即数字
]#结束文字]不需要在这里转义。
)#结束捕获
(\[^]]+])#第二个索引的regexp与之前相同
#替换
\1\3\2#切换索引,但重新排列第二和第三捕获组

注意:将
\[^]+]
切换到对您来说更清晰的
\[[0-9]+]
,因此不要说匹配一个开始的方括号,后面跟一个或多个无结束方括号,后面跟一个结束方括号,而是说匹配一个开始的方括号,后面跟一个或多个数字,后面跟一个结束方括号

行得通,谢谢。你能解释一下([[^]]+])表格吗?为什么有两个[和三个]?我也对]+感到惊讶。这很有效,谢谢。你能解释一下([[^]]+])表格吗?为什么有两个[和三个]?我也对]+感到惊讶。这很有效,谢谢。至于sudo o解决方案,我对([[^]]*]感到有点惊讶,主要是因为有两个[和三个]。你能解释一下吗?注意:POSIX友好的
sed的/\(zData\)\(\[[^]*]\)\(\[^]*]\)/\1\3\2/'
很有效,谢谢。至于sudo o解决方案,我对([[^]]*]感到有点惊讶,主要是因为有两个[和三个]。你能解释一下吗?注意:POSIX友好的
sed's/\(zData\)\(\[[^]*]\)\(\[^]*]\)/\1\3\2/'