2017-07-10 4 views
-2

基本的に、私はUnixにシェルスクリプトを書いていますが、文/文字列内でどのような場所に単語が現れるかを示す値を取得し、変数の値。Unix - ある単語が文章の中に入る場所を見つける方法

たとえば、 "blue"という単語は、次の文 "fast blue car"の3番目の単語です。したがって、私はこの単語の値を3にして$ blueという変数に格納したいと思います。私。 echo $ blueは数字3を出力します。

私が今までに見つけたすべての例は、単語ではなく単語の位置を単語で表示しています。

+0

? – hek2mgl

答えて

3

多分このようなものでしょうか?

text="The quick brown fox jumps over the lazy dog." 
tokens=$(echo $text | sed 's/[.\\\/;,?!:]//g') # Add any missing punctuation marks here 
$pos = 0 
for token in $tokens 
do 
    pos=$(($pos + 1)) 
    if [[ "$token" == "fox" ]] 
    then 
     echo $pos 
    fi 
done 

これは、単語 "fox"(この場合は4)の位置をコマンドラインに出力します。複数の単語が出現すると、複数の出力が得られます。

+0

これはまさに私が必要とすることです...ありがとう!私のUnixエクスペリエンスは本当に基本的なものです...トークンラインが何をしているのかを簡単に説明できますか? – data101

+0

@ data101:句読点を取り除きます。 bashが文字列を処理する方法は、処理される各項目に含まれます。例えば、 '[[" $ token "==" fox "]]'は 'fox'にはマッチしますが' fox 'にはマッチしません。 –

1

awkの別の記事です。 SebastianLenartowiczの$text @借入:

$ text="the quick brown fox jumps over the lazy dog" # in lower and no punctuations 

$ echo $text | awk -v RS="[ \n]" -v s=fox '$0==s{print NR}' 
4 

を説明:

  • -v RS="[ \n]"R ECORD S空白や改行にeparator
  • -v s=fox検索ワードがあれば、変数s
  • $0==s{print NR}でスクリプトに行きますレコード($0)equあなたがこれまでに試してみました何ALS s印刷行または記録NR
+0

これは本当に素晴らしい答えです!私は1行で何が必要ですか? – data101

関連する問題