用sed翻转数组索引

时间:2013-03-20 14:53:08

标签: 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

但不幸的是,赛德说:

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

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

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

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

感谢您的帮助

2 个答案:

答案 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}},而不是说匹配一个开头的方括号,后跟一个或多个非关闭括号后跟一个右括号,你说的是匹配一个开头的方括号,后跟一个或多个数字,后跟一个右括号。