좋아, 내가 필요한 것을 수행할 방법을 찾을 수 없는 것 같습니다.
다음과 같은 텍스트 파일 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을 더한 값을 대체합니다. 수정자는 이 교체가 전역적으로, 즉 한 줄에 여러 번 수행된다는 것을 의미합니다.$1
g
(?<=\[)
길이가 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) .
그런데 왜 (공백이 있는 점)이 필요한지 잘 모르겠습니다 .