1

我有一些 java 代码声明了一个我想要翻转的二维数组。内容是这样的:

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 说:

sed: -e expression #1, char 43: Unmatched ) or \)

字符串“zData”可能包含某种标志或选项吗?

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

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

谢谢你的帮助

4

2 回答 2

2

试试那个:

sed 's#\([a-zA-Z0-9_-]\+\)\(\[[^]]*\]\)\(\[[^]*]\]\)\(.*$\)#\1\3\2\4#'

它为变量名、第一个索引、第二个索引和其余的添加了四个捕获,然后切换顺序。

编辑: @Sudo_O 的扩展正则表达式解决方案更具可读性。谢谢!然而,在某些系统上sed -r可能不可用,因为它不是 基本 POSIX的一部分。

于 2013-03-20T15:23:17.427 回答
2

简单:

$ sed -r 's/(zData)(\[[^]]+])(\[[^]]+])/\1\3\2/' file
zData[0][0] = 198;
zData[1][0] = 198;
zData[2][0] = 198;

正则说明:

# 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]+]您来说更清楚,所以不是说匹配一个左方括号,然后是一个或多个非右括号,然后是一个右括号,而是说匹配一个左方括号,后跟一个或多个数字,然后一个右括号。

于 2013-03-20T15:27:26.913 回答