텍스트에서 forloop 값을 바꾸고 결과를 연결합니다.

텍스트에서 forloop 값을 바꾸고 결과를 연결합니다.

연산 set Z=2;6;11;165;95;59;131등이 있습니다. Z다음 텍스트를 바꾸고 결과를 파일에 연결하고 싶습니다 .

HSS-ServiceType=vpbxdZ
HSS-ServiceTrigger=Z0401
    no HSS-SptGroup=1
    no HSS-SptGroup=2
commit -s
    up
HSS-ServiceTrigger=Z0471
    no HSS-SptGroup=1
    no HSS-SptGroup=2
commit -s
    up
no HSS-ServiceProfile=vpbxdZs1
commit -s
no HSS-ServiceTrigger=Z0401
commit -s
no HSS-ServiceTrigger=Z0471
commit -s
up
no HSS-ServiceType=vpbxdZ
commit -s

awk나는 아래와 같은 것을 시도했습니다

awk 'BEGIN { for(Z=2;6;11;165;95;59;131) print 
/HSS-ServiceType=vpbxdZ
/HSS-ServiceTrigger=Z0401
/   no HSS-SptGroup=1
/   no HSS-SptGroup=2
/commit -s
    up
/HSS-ServiceTrigger=Z0471
/   no HSS-SptGroup=1
/   no HSS-SptGroup=2
/commit -s
/   up
/no HSS-ServiceProfile=vpbxdZs1
/commit -s
/no HSS-ServiceTrigger=Z0401
/commit -s
/no HSS-ServiceTrigger=Z0471
/commit -s
/up
/no HSS-ServiceType=vpbxdZ
/commit -s }' test1.txt

하지만 오류로 인해 실패합니다

"^ unterminated regexp":

원하는 출력은 다음과 같습니다.

HSS-ServiceType=vpbxd2
    HSS-ServiceTrigger=20401
        no HSS-SptGroup=1
        no HSS-SptGroup=2
    commit -s
        up
    HSS-ServiceTrigger=20471
        no HSS-SptGroup=1
        no HSS-SptGroup=2
    commit -s
        up
    no HSS-ServiceProfile=vpbxd2s1
    commit -s
    no HSS-ServiceTrigger=20401
    commit -s
    no HSS-ServiceTrigger=20471
    commit -s
    up
no HSS-ServiceType=vpbxd2
commit -s

HSS-ServiceType=vpbxd6
    HSS-ServiceTrigger=60401
        no HSS-SptGroup=1
        no HSS-SptGroup=2
    commit -s
        up
    HSS-ServiceTrigger=60471
        no HSS-SptGroup=1
        no HSS-SptGroup=2
    commit -s
        up
    no HSS-ServiceProfile=vpbxd6s1
    commit -s
    no HSS-ServiceTrigger=60401
    commit -s
    no HSS-ServiceTrigger=60471
    commit -s
    up
no HSS-ServiceType=vpbxd6
commit -s

HSS-ServiceType=vpbxd11
    HSS-ServiceTrigger=110401
        no HSS-SptGroup=1
        no HSS-SptGroup=2
    commit -s
        up
    HSS-ServiceTrigger=110471
        no HSS-SptGroup=1
        no HSS-SptGroup=2
    commit -s
        up
    no HSS-ServiceProfile=vpbxd11s1
    commit -s
    no HSS-ServiceTrigger=110401
    commit -s
    no HSS-ServiceTrigger=110471
    commit -s
    up
no HSS-ServiceType=vpbxd11
commit -s

HSS-ServiceType=vpbxd165
    HSS-ServiceTrigger=1650401
        no HSS-SptGroup=1
        no HSS-SptGroup=2
    commit -s
        up
    HSS-ServiceTrigger=1650471
        no HSS-SptGroup=1
        no HSS-SptGroup=2
    commit -s
        up
    no HSS-ServiceProfile=vpbxd165s1
    commit -s
    no HSS-ServiceTrigger=1650401
    commit -s
    no HSS-ServiceTrigger=1650471
    commit -s
    up
no HSS-ServiceType=vpbxd165
commit -s

HSS-ServiceType=vpbxd95
    HSS-ServiceTrigger=950401
        no HSS-SptGroup=1
        no HSS-SptGroup=2
    commit -s
        up
    HSS-ServiceTrigger=950471
        no HSS-SptGroup=1
        no HSS-SptGroup=2
    commit -s
        up
    no HSS-ServiceProfile=vpbxd95s1
    commit -s
    no HSS-ServiceTrigger=950401
    commit -s
    no HSS-ServiceTrigger=950471
    commit -s
    up
no HSS-ServiceType=vpbxd95
commit -s

이는 원본 파일의 7개 복사본이며, 각 복사본은 원래 시도의 루프 문을 Z기반으로 for다른 값으로 대체되었습니다 .

답변1

내 생각엔 예제 파일에서 Z 값을 변경하려는 것 같습니다.

for z in 2 6 11 165 95 59 131
do 
   sed -e "s/=Z/=$z/" -e "s/dZ/d$z/" sample.txt
done > result.txt

어디

  • sample.txt당신의 시작 파일은 무엇입니까
  • -e "s/=Z/=$z/"-e "s/dZ/d$z/"실제 검색 및 교체 순서입니다 .

답변2

awk 자체 내에서 for 루프를 수행할 수 있습니다.

Z="2;6;11;165;95;59;131" \
awk '
  BEGIN { I = ENVIRON["Z"] }
  { f = f $0 ORS }
  END {
    N = split(I, a, ";")
    for (i=1; i<=N; i++) {
      t = f
      gsub(/dZ/, "d" a[i], t)
      gsub(/=Z/, "=" a[i], t)
      print t
    }
  }
' file.txt

환경 변수 Z에 인덱스를 저장합니다.

세미콜론 abd로 분할하고 반복 가능한 인덱스를 배열 a에 저장합니다.

전체 파일을 var f에 넣습니다.

마지막으로 인덱스를 반복하고 정규식 dZ 및 =Z를 반복 가능한 항목으로 바꿉니다. 변수를 인쇄합니다. 다른 주사위로 반복합니다.

관련 정보