我有一些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
感谢您的帮助
答案 0 :(得分:2)
尝试一下:
sed 's#\([a-zA-Z0-9_-]\+\)\(\[[^]]*\]\)\(\[[^]*]\]\)\(.*$\)#\1\3\2\4#'
它为变量名称,第一个索引,第二个索引和其余部分添加了四个捕获,然后切换顺序。
编辑: @ Sudo_O带有扩展正则表达式的解决方案更具可读性。谢谢!然而,在某些系统sed -r
可能无法使用,因为它不属于basic POSIX。
答案 1 :(得分:2)
Simples:
$ sed -r 's/(zData)(\[[^]]+])(\[[^]]+])/\1\3\2/' file
zData[0][0] = 198;
zData[1][0] = 198;
zData[2][0] = 198;
Regexplanation:
# Match
(zData) # Capture the variable name we want to transpose
( # Start capture group for first index
\[ # Opening bracket escaped to mean literal [
[^]]+ # One or more none ] characters i.e the digits
] # The closing literal ] doesn't need escaping here.
) # Close the capture
(\[[^]]+]) # Same regexp as before for the second index
# Replace
\1\3\2 # Switch the indexes but rearranging the 2nd and 3rd capture groups
注意:如果\[[^]]+]
更清楚\[[0-9]+]
,请切换{{1}},而不是说匹配一个开头的方括号,后跟一个或多个非关闭括号后跟一个右括号,你说的是匹配一个开头的方括号,后跟一个或多个数字,后跟一个右括号。