さて、私が必要なことをする方法を見つけることができないようです。
次のようなテキストファイル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特殊トークンを[
使用してエスケープする必要があります)。長さがゼロの場合、置き換えられるセクションの一部ではないことを意味します。\
[
(?=\])
長さがゼロの肯定的な予測アサーションです。つまり、前の内容は]
後の場合にのみ一致します(再びエスケープされます)。
だからこれはとの間のすべての数を取り、その数を増やします[
。]