%20%EC%B0%BE%EA%B8%B0.png)
나는 다음과 같은 줄을 가지고있다
Xckt VDD VSS sig[1] sig[2] sig[3] sig[4] sig[5] sig[6] CKT
sig[4]가 어디에 있는지 찾고 싶습니다. 이 경우에는 반환되어야 합니다.7. 동일한 작업을 수행하기 위해 Bash의 간단한 스크립트/한 줄짜리 스크립트를 원합니다. 중복 일치의 경우 모든 일치가 행에 발생하면 시퀀스 번호가 커집니다.
답변1
awk
다음을 수행할 수 있습니다.
awk '{for(i=1;i<=NF;i++)if($i=="sig[4]")print i}'
이는 항목이 여러 개인 경우에도 효과적입니다.
모든 숫자가 같은 줄에 있어야 하는 경우 print
로 바꾸고 printf
그에 따라 조정할 수 있습니다.
답변2
Rush에는 멋진 한 줄 솔루션이 있습니다.;이것은 문자열의 모든 일치 항목을 인쇄하는 간단한 bash 함수입니다.
function pratappos() {
target=$1; shift
pos=1
while [[ $# -gt 0 ]]
do
[[ "$1" = "$target" ]] && echo $pos
shift; ((++pos))
done
unset target pos
}
주어진 목록에서 문자열을 검색하도록 일반화되어 있으므로, 예를 들어 .bashrc 또는 현재 셸에서 함수를 설정한 후 다음과 같이 호출할 수 있습니다.
pratappos sig[4] Xckt VDD VSS sig[1] sig[2] sig[3] sig[4] sig[5] sig[6] CKT
7
또는 (두 게임):
pratappos sig[4] Xckt VDD VSS sig[1] sig[2] sig[3] sig[4] sig[5] sig[6] CKT sig[4]
7
11
...전달된 첫 번째 인수는 검색할 문자열로 처리되고 그 뒤에는 검색할 문자열의 나머지 부분이 옵니다. 이는 shift
주어진 문자열을 $IFS로 구분된 것처럼 처리하는 위치 인수를 사용합니다 .
이전 요점을 명확히 하려면 다음을 수행하십시오.
pratappos 'foo bar' a b foo bar 'foo bar' rest here
5
답변3
perl
예를 들어 에 설명된 대로 List::MoreUtils 모듈을 사용하여 이 작업을 수행할 수 있습니다.[perl] 배열에서 일치하는 항목의 인덱스를 가져옵니다.
perl -MList::MoreUtils=indexes -alne '
print $_+1 for indexes { $_ eq "sig[4]" } @F
'
주어진 입력 라인을 사용하여 테스트
$ perl -MList::MoreUtils=indexes -alne '
print $_+1 for indexes { $_ eq "sig[4]" } @F
' <<< "Xckt VDD VSS sig[1] sig[2] sig[3] sig[4] sig[5] sig[6] CKT"
7
행에는 여러 인스턴스가 포함되어 있습니다.
$ perl -MList::MoreUtils=indexes -alne '
print $_+1 for indexes { $_ eq "sig[4]" } @F
' <<< "Xckt VDD VSS sig[1] sig[2] sig[3] sig[4] sig[5] sig[6] sig[4] CKT"
7
10