さて、私が必要なことをする方法を見つけることができないようです。
次のようなテキストファイルAがあるとしましょう。
(freqBiasL2[27])
(SatBiasL1[27])
(defSatBiasL2_L1[27])
(defSatBiasSlope[27])
(defSatBiasSigma[27])
(freqBiasL2[28])
(SatBiasL1[28])
(defSatBiasL2_L1[28])
(defSatBiasSlope[28])
(defSatBiasSigma[28])
(freqBiasL2[29])
(SatBiasL1[29])
(defSatBiasL2_L1[29])
(defSatBiasSlope[29])
(defSatBiasSigma[29])
など。すべてのインデックスi = i + 3になるように[]角かっこ間のインデックスを変更したいと思います。
forループとsedの組み合わせを試しましたが、うまくいきません
for i in {27..107..1}
do
i_new=$((i+3))
sed -e 's/\['$i'\]/\['$i_new'\]/' prova.txt
done
問題は最初の27個を30に変更しますが、次の繰り返しでは、インデックスが30のブロック2個(変更されたブロックと元のブロック)が見つかります。
変更されたインデックスを上書きせずにこれを行うにはどうすればよいですか?
はい、ありがとうございます。改善するために質問を編集しました。インデックスが2つある場合、どうすれば次のようにできますか?
(freqBiasL2[32][100])
(SatBiasL1[32][101])
(defSatBiasL2_L1[32][102])
(defSatBiasSlope[32][103])
(defSatBiasSigma[32][104])
2番目のインデックスだけを増やし、1番目のインデックスは無視したいですか?
答え1
パールの使用:
perl -pe 's/(?<=\[)(\d+)(?=\])/$1+1/ge' prova.txt
説明する:
-p
各行を繰り返し、各行の後に結果を印刷することを意味します。-e
各行で実行する式を定義します。s/from/to/
簡単に交換してみてくださいs/(\d+)/$1+1/ge
1つ以上の数字を一致させてキャプチャした$1
後、e
末尾の修飾子は代替文字列が式であることをPerlに伝えます。$1+1
値に1を加えた値を置き換えます。修飾子は、この置換がグローバルに、つまり1行に複数回行われることを意味します。$1
g
(?<=\[)
長さ0の肯定的なLookBehindアサーションです。つまり、次の内容は前の場合にのみ一致します(正規表現ではas is特殊トークンを[
使用してエスケープする必要があります)。長さがゼロの場合、置き換えられるセクションの一部ではないことを意味します。\
[
(?=\])
長さがゼロの肯定的な予測アサーションです。つまり、前の内容は]
後の場合にのみ一致します(再びエスケープされます)。
だからこれはとの間のすべての数を取り、その数を増やします[
。]
答え2
以下も使用できますawk
。
awk -F '[\\[\\]]' '{if ($2) { sub($2, $2 + 3)}} 1' prova.txt
実際、これは次のように少し短くなる可能性があります。
awk -F '[\\[\\]]' '$2 { sub($2, $2 + 3)} 1' prova.txt
答え3
私は既に問題を解決していることを知っていますが、参考までにコードを非常に簡単に修正することで問題を解決できます。つまり、繰り返すシーケンスを逆にするだけです。
{107..27..-1}
(またはより簡潔に{107..27}
)問題を解決するのに十分です。30を置き換えると元の30だけが見つかり、27はまだ交換されていないためです。
答え4
さて、二重索引付けの解決策とCAS修正コマンドを見つけたようです。これにより操作が実行されます。
perl -p -e 's/\[(\d+)\]\[(\d+)\]/"[" . ($1) . "][" . ($2+40) . "]"/ge' prova.txt
. ($1) .
しかし、なぜ(空白がある点)が必要なのかよくわかりません。