bash에서 문자열의 단어 색인을 찾는 방법은 무엇입니까? 이상의 공백으로 구분 된 여러 단어가 포함

bash 스크립트에서

하나 이상의 공백으로 구분 된 여러 단어가 포함 된 문자열이 있습니다. 즉 :

Name   Age Sex  ID         Address

예를 들어 단어 “나이”의 색인을 찾으려면 단어를 찾으려면 어떻게해야합니까?

원하는 단어의 색인 번호를 직접 반환하는 명령이 있습니까?

감사.



답변

Bash 는 문자열 자체에서 단어 분리 를 수행합니다 . 실제로 문제를 피하고 인용이 그렇게 중요한 이유를 피하는 것이 아닙니다. 따옴표를 사용하지 않고 문자열을 배열에 넣으면 bash는 단어 분리를 사용하여 개별 요소를 구분합니다. 문자열이 변수에 저장되어 있다고 가정하면 $str,

ar=($str) # no quotes!

5 요소의 배열을 반환합니다. 배열 인덱스는 단어 인덱스 (대부분의 스크립팅 및 프로그래밍 언어에서와 같이 0부터 시작)입니다. 즉, “나이”는

${ar[1]}  # 0 => Name, 1 => Age, 2 => Sex, 3 => ID, 4 => Address

또는 컨텐츠별로 요소 인덱스를 찾아야하는 경우 배열을 반복합니다. 즉

function el_index {
    cnt=0; for el in "${ar[@]}"; do
        [[ $el == "$1" ]] && echo $cnt && break
        ((++cnt))
    done
}
el_index "Age" # => 1


답변

$ export FOO="Name   Age Sex  ID         Address"

* 연령을 연령으로 대체- “연령”이전의 모든 항목을 제거합니다.

$ echo ${FOO/*Age/Age}
Age Sex ID Address

“나이”전에 무엇이든 가져 오기

$ echo ${FOO/Age*/}
Name

해당 문자열의 길이 ( “Age”의 색인)를 가져옵니다.

$ BEGIN=${FOO/Age*/}
$ echo ${#BEGIN}
7


답변

bash를 엄격하게 사용할 필요는 없지만 bash가있는 시스템에서 일반적으로 사용되는 다른 프로그램을 사용할 수 있다면 다음과 같은 것을 사용할 수 있습니다.

echo "Name   Age Sex ID  Addr" | python -c 'print(raw_input().index("Age"))+1'

파이썬은 문자열 색인을 0에서 시작하므로 명령 끝에 +1을 추가했습니다.


답변

bash의 네이티브 정규식을 사용할 수 있습니다

# a function to print the index of a field and its name
printIx() {
  for ((l=0,i=1;i<$1;i++)) ;do
     ((l+=${#BASH_REMATCH[i]}))
  done
  printf '%3s %s\n' $l "$2"
}

#   Using a zero based index
#   "0----+----1----+----2----+----3----+----4"
str="  Name   Age Sex  ID         Address   "

if [[ $str =~ ^(\ *)(Name)(\ +)(Age)(\ +)(Sex)(\ +()ID)(\ +)(Address)\ *$ ]] ;then
  F=(Name Age Sex ID Address)
  f=(   2   4   6  8      10)  # regex back-references
  for ((g=0;g<${#f[@]};g++)) ;do
     printIx  ${f[g]} "${F[g]}"
  done
fi

산출

  2 Name
  9 Age
 13 Sex
 20 ID
 29 Address


답변

참고 : 여기에서 색인으로 가정하면 단어의 시작 부분이 아닌 문자열의 어떤 문자 가 아닌 어떤 단어 인지 (0에서 시작) 알고 싶다는 의미 입니다. 다른 답변은 후자를 언급합니다.

내가 아는 바는 없지만 만들 수 있습니다. 두 가지 트릭 :

  1. for 구문 의 선천적 능력을 사용하여 인용되지 않은 입력을 공백으로 나눕니다.
  2. 원하는 열을 찾을 수없는 경우를 처리하십시오. 이 경우, 발견 된 인덱스를 stout에 보내고 상태 코드가 찾기 성공 여부를 표시하도록 선택했습니다. 다른 가능성이 있습니다.

암호:

#!/bin/bash
find_index() {
    local str=$1
    local search=$2
    let local n=0
    local retval=1 # here, 1 is failure, 0 success
    for col in $str; do # $str unquoted -> whitespace tokenization!
    if [ $col = $search ]; then
        echo $n
        retval=0
        break
    else
        ((n++))
    fi
    done
    return $retval
}

test="Name   Age Sex  ID         Address"
idx=`find_index "$test" Age`
if [ $? -ne 0 ]; then
    echo "Not found!"
else
    echo "Found: $idx"
fi


답변

쉘에서 다음 자바 스크립트 oneliner를 사용해보십시오 (javascript 쉘 사용).

$ js <<< "x = 'Name   Age Sex  ID         Address'; print(x.indexOf('Age'));"
7

또는 here-doc을 사용하십시오.

js <<EOF
x = 'Name   Age Sex  ID         Address';
print(x.indexOf('Age'));
EOF


답변

잘 작동하는 솔루션을 찾았습니다.

$ string = ‘지금은 시간입니다’
$ buf = the $ {string # * the}
$ echo $ buf
출력 : 시간
$ index = $ (($ {# string}-$ {# buf} + 1))
$ echo $ index
출력 : 8-> 첫 단어 “the”의 색인

입력 문자열의 첫 번째 발생을 리턴하는 Java의 indexOf () 함수와 유사하게 작동합니다.

이 솔루션은 여기 http://www.linuxquestions.org/questions/linux-newbie-8/bash-string-manipulation-help-670627/ (마지막 게시물)에 있습니다. 이 사람은 내 하루를 구했다. 그에게 신용.

첫 번째 indexof에서 하위 문자열을 수행하려는 경우 더 빠른 방법입니다.

$ a = “일부 긴 문자열”
$ b = “ri”
$ echo $ {a / * $ b / $ b}

$ echo $ {a / $ b * / $ b}
긴 줄

/programming/10349102/shell-script-substring-from-first-indexof-substring