1

反転したい2D配列を宣言する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#'

変数名、最初のインデックス、2番目のインデックス、残りの4つのキャプチャを追加してから、順序を切り替えます。

編集:拡張正規表現を使用した@Sudo_Oのソリューションは、はるかに読みやすくなっています。そのためのThx!それでも、基本的なPOSIXsed -rの一部ではないため、一部のシステムでは使用できない場合があります 。

于 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]+]、開始角かっこ、1つ以上の非終了角かっこ、終了角かっこを一致させるのではなく、開始角かっこ、1桁以上の数字、閉じ角かっこ。

于 2013-03-20T15:27:26.913 に答える