파일의 인덱스 증가

파일의 인덱스 증가

좋아, 내가 필요한 것을 수행할 방법을 찾을 수 없는 것 같습니다.

다음과 같은 텍스트 파일 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])

두 번째 인덱스만 증가시키고 첫 번째 인덱스는 무시하고 싶습니까?

답변1

펄 사용:

perl -pe 's/(?<=\[)(\d+)(?=\])/$1+1/ge' prova.txt

설명하다:

  • -p각 줄을 반복하고 각 줄 다음에 결과를 인쇄하는 것을 의미합니다.
  • -e각 줄에서 실행할 표현식을 정의합니다.
  • s/from/to/간단하게 교체해보세요
  • s/(\d+)/$1+1/ge하나 이상의 숫자를 일치시키고 로 캡처한 $1다음 e끝에 있는 수정자는 대체 문자열이 표현식임을 Perl에게 알려줍니다. $1+1값에 1을 더한 값을 대체합니다. 수정자는 이 교체가 전역적으로, 즉 한 줄에 여러 번 수행된다는 것을 의미합니다.$1g
  • (?<=\[)길이가 0인 긍정적인 LookBehind 어설션입니다. 즉, 뒤에 오는 내용은 앞에 오는 경우에만 일치합니다 ( 정규식에서 as is 특수 토큰을 [사용하여 이스케이프해야 함 ). 길이가 0이면 교체될 섹션의 일부가 아님을 의미합니다.\[
  • (?=\])길이가 0인 긍정적인 예측 어설션입니다. 즉, 앞에 오는 내용은 ]뒤에 오는 경우에만 일치합니다(다시 이스케이프됨).

그래서 이것은 과 사이의 모든 숫자를 취하고 그 숫자를 증가시킵니다 [.]

답변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) .그런데 왜 (공백이 있는 점)이 필요한지 잘 모르겠습니다 .

관련 정보