ㅏ. 아래와 같이 행 집합이 있습니다.
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;
이는
i
1부터 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
대신 사용할 수 있습니다.오직필수 인덱스는 다음과 같습니다.
i
인덱스에 대한 환경 변수 만들기export i
필요한 인덱스를 변수로 바꾸는 템플릿 파일을 만듭니다.
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:$]}; }
루프로
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