Sed/Awk/변수 변경을 사용하여 동일한 줄을 여러 번 인쇄하는 방법은 무엇입니까?

Sed/Awk/변수 변경을 사용하여 동일한 줄을 여러 번 인쇄하는 방법은 무엇입니까?

ㅏ. 아래와 같이 행 집합이 있습니다.

cr_v8_sel0 : cross cp_v8_en, cp_sel0 {
   ignore_bins ig_v8_sel0 = binsof(cp_v8_en) && binsof(cp_sel0) intersect {[0:3],[5:$]}; 
}

b.동일한 행 세트를 여러 번 인쇄하고 10진수 문자열을 sel0에서 sel31로 변경하고 싶습니다.

씨. 예: 참고: sel0은 행을 sel1로 변경하고 인쇄합니다. 그리고 sel0에서 sel31로 이동해야 합니다.

cr_v8_sel0 : cross cp_v8_en, cp_sel0 {
   ignore_bins ig_v8_sel0 = binsof(cp_v8_en) && binsof(cp_sel0) intersect {[0:3],[5:$]}; 
}
cr_v8_sel1 : cross cp_v8_en, cp_sel1 {
   ignore_bins ig_v8_sel0 = binsof(cp_v8_en) && binsof(cp_sel1) intersect {[0:3],[5:$]}; 
}

d. 일종의 for 루프를 사용하여 인쇄할 수 있나요? 손으로 타이핑하는 대신? sed나 awk 또는 다른 스크립트 명령을 사용하시나요?

답변1

노력하다:

awk '{print; for (i=1;i<=31;i++) {x=$0; gsub(/sel0/, "sel" i, x); print x;}}' RS="" file

예를 들어 반복 횟수는 3으로 제한됩니다.

$ awk '{print; for (i=1;i<=3;i++) {x=$0; gsub(/sel0/, "sel" i, x); print x;}}' RS="" file
cr_v8_sel0 : cross cp_v8_en, cp_sel0 {
   ignore_bins ig_v8_sel0 = binsof(cp_v8_en) && binsof(cp_sel0) intersect {[0:3],[5:$]}; 
}
cr_v8_sel1 : cross cp_v8_en, cp_sel1 {
   ignore_bins ig_v8_sel1 = binsof(cp_v8_en) && binsof(cp_sel1) intersect {[0:3],[5:$]}; 
}
cr_v8_sel2 : cross cp_v8_en, cp_sel2 {
   ignore_bins ig_v8_sel2 = binsof(cp_v8_en) && binsof(cp_sel2) intersect {[0:3],[5:$]}; 
}
cr_v8_sel3 : cross cp_v8_en, cp_sel3 {
   ignore_bins ig_v8_sel3 = binsof(cp_v8_en) && binsof(cp_sel3) intersect {[0:3],[5:$]}; 
}

어떻게 작동하나요?

  • print

    그러면 원본 버전이 으로 인쇄됩니다 sel0.

  • for (i=1;i<=31;i++) {x=$0; gsub(/sel0/, "sel" i, x); print x;

    이는 i1부터 31까지 반복하고 대체를 수행한 후 결과를 인쇄합니다.

  • RS=""

    이는 awk에게 전체 단락을 한 번에 읽도록 ​​지시합니다. 소스 코드에 빈 줄이 없기 때문에 전체 소스 코드를 한 번에 읽는 효과가 있습니다.

여러 줄 버전

awk '
  {
     print
     for (i=1;i<=31;i++)
     {
       x=$0
       gsub(/sel0/, "sel" i, x)
       print x;
     }
   }
   ' RS="" file

답변2

여기에 있는 문서를 사용하세요.

for i in {0..31}; do 
cat << EOF
cr_v8_sel${i} : cross cp_v8_en, cp_sel${i} {
   ignore_bins ig_v8_sel${i} = binsof(cp_v8_en) && binsof(cp_sel${i}) intersect {[0:3],[5:$]}; 
}
EOF
done

이 접근 방식을 사용하는 경우 여기 문서의 다른 어떤 것도 쉘 확장이 가능하지 않을 수 있다는 점에 주의해야 합니다(이 경우에는 쉘 확장이 가능한 것처럼 {[0:3],[5:$]}보이지만 그렇지 않습니다). 적어도 bash에서는 그렇지 않습니다. ). GNU 명령을 사용하는 envsubst본질적으로 유사하지만 더 안전한 접근 방식을 gettext대신 사용할 수 있습니다.오직필수 인덱스는 다음과 같습니다.

  1. i인덱스에 대한 환경 변수 만들기

    export i
    
  2. 필요한 인덱스를 변수로 바꾸는 템플릿 파일을 만듭니다.i

    $ cat template
    cr_v8_sel${i} : cross cp_v8_en, cp_sel${i} {
       ignore_bins ig_v8_sel${i} = binsof(cp_v8_en) && binsof(cp_sel${i}) intersect {[0:3],[5:$]};
    }
    
  3. 루프로 i대체될 값오직의 가치i

    for i in {0..31}; do envsubst '$i' < template; done
    

답변3

입력 파일 만들기sel.txt, (멋진 것은 아니며 OP가 변경되지 않은 것) 루프를 실행 bash하고 sed그 안에서 다음을 사용합니다.

echo "cr_v8_sel0 : cross cp_v8_en, cp_sel0 {
   ignore_bins ig_v8_sel0 = binsof(cp_v8_en) && binsof(cp_sel0) intersect {[0:3],[5:$]}; 
}" > sel.txt

for f in {0..31} ; do sed 's/sel0/sel'$f'/g' sel.txt ; done

관련 정보