変数のgrep


58

変数があるとしましょう

line="This is where we select from a table."

今、私は何回選択が文で発生するかをgrepしたい。

grep -ci "select" $line

試しましたが、うまくいきませんでした。私も試しました

grep -ci "select" "$line"

それでも動作しません。次のエラーが表示されます。

grep: This is where we select from a table.: No such file or directory

1
herestringを使用する必要があります...<<<"$line" 。コマンドは、grep代わりにファイルを期待している
バレンティンBajrami

回答:


85

grep標準入力を読んでください。パイプを使用しそこに行きます...

$ echo "$line" | grep select

...またはhere文字列 ...

$ grep select <<< "$line"

また、greppingの前にスペースを改行で置き換えたい場合があります。

$ echo "$line" | tr ' ' '\n' | grep select

...またはgrep、一致のみを印刷するように依頼できます。

$ echo "$line" | grep -o select

これにより、一致した場合に残りの行を削除できます。

編集:おっと、少し速すぎて読んで、マルコに感謝します。発生をカウントするために、これらのいずれかをパイプするだけwc(1)です;)

別の編集後に行わlzkata引用、のコメント$line使用した場合echo


3
OPは、文字列の出現回数をカウントしたいので、あなたが追加することができますwcタスクを完了するために:grep -o <string> <<< "$variable" | wc -l
マルコ・

2
echo "$line"tr
イズカタ14年

Here Stringの可用性は何ですか?Bashまたは別のシェルが必要ですか?

Wikipediaによると、ここでの文字列はbash、ksh、zshで利用可能です(ただし、他にもあると思われます)。
ジョンWHスミス

7
test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done

このgrepような単純なことを呼び出す必要はありません。

または関数として:

occur() while case "$1" in (*"$2"*) set -- \
        "${1#*"$2"}" "$2" "${3:-0}" "$((${4:-0}+1))";;
        (*) return "$((${4:-0}<${3:-1}))";;esac
        do : "${_occur:+$((_occur=$4))}";done

2つまたは3つの引数が必要です。それ以上を提供すると、結果が歪められます。次のように使用できます。

_occur=0; occur ... . 2 && echo "count: $_occur"

... 少なくとも2回発生すると.、in の発生回数を出力し...ます。このような:

count: 3

場合は、$_occurどちらか空であるかunset、それが呼び出されたとき、それは全くのシェル変数には影響しないとされますreturn場合は1 "$2"で発生した"$1"よりも少ない"$3"回数。または、2つの引数のみで呼び出された場合、にreturnない場合のみ1 "$2"になり"$1"ます。それ以外の場合は、0を返します。

そのため、最も単純な形式では、次のことができます。

occur '' . && echo yay || echo shite

...印刷する...

shite

...しかし...

occur . . && echo yay || echo shite

...印刷します...

yay

また、少し異なる方法で記述し$2(*"$2"*)and "${1#*"$2"}"ステートメントの両方で引用符を省略することもできます。その場合sh[io]te、一致テストのように、一致にシェルグロブを使用できます。


1
+1:より速く、確かに。作品中bashおよびdash/ sh(そしておそらくいくつかの他)。
ジョンWHスミス14年

@JohnWHSmith-編集は優れていますが、それでも移植性は同じです。
mikeserv 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.