Bash의 한 줄에서 일치하는 단어의 위치(문자의 위치가 아님) 찾기

Bash의 한 줄에서 일치하는 단어의 위치(문자의 위치가 아님) 찾기

나는 다음과 같은 줄을 가지고있다

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

관련 정보