シェルだけが機能を実行できます。実行するにはfind
にbash -c
を使用する必要があります。これはまた、新しいプロセスがそれを見るために関数をエクスポートする必要がある理由です。
parser() {
while IFS= read -r line; do
echo "Processing line: $line"
done <<< "$1"
}
export -f parser
find . -type f -exec bash -c 'parser "$(grep -iPho "barh(li|mar|ag)" "$1")"' -- {} \;
上記のコードは、file1、file2などのすべての出現を処理する関数に送信します。それは各ラインを1つずつ送信しないため、あなたの関数内のラインをループする必要があります。ファイル内にあなたの正規表現の出現がない場合、まだは空の入力であなたの関数を呼び出します!
parser() {
echo "Processing line: $1"
}
export -f parser
find . -type f -exec bash -c 'grep -iPho "barh(li|mar|ag)" "[email protected]" | while IFS= read -r line; do parser "$line"; done' -- {} +
EDIT:あなたのための最善の解決策ではないかもしれません
はそうのはライン一つずつbash -c
の文と本当にプロセス内のループを追加してみましょう非常に素敵でシンプルなソリューションは、@gniourf_gniourfによって提案された
bash -c
を使用していません:
parser() {
echo "Processing line: $1"
}
find . -type f -exec grep -iPho "barh(li|mar|ag)" {} + | while IFS= read -r line; do parser "$line"; done
このアプローチは正常に動作し、は1行ずつ処理します。また、もありませんでは、このアプローチで関数をエクスポートする必要はありません。しかし、あなたを驚かせるかもしれないことを気にする必要があります。
パイプライン内の各コマンドは、それ自身のサブシェルで実行され、parser
関数または一般的なwhile
の変数割り当ては、そのサブシェルから戻った後に失われます。スクリプトを書く場合は、単純なshopt -s lastpipe
で十分であり、現在のシェル環境で最後のpipeコマンドを実行します。以前bash -c
の例では、あなたが同じ行動を経験すると、あなたの変数の割り当てが同様に失われること
parser() {
echo "Processing line: $1"
}
while IFS= read -r line; do
parser "$line";
done < <(find . -type f -exec grep -iPho "barh(li|mar|ag)" {} +)
注:または、プロセス置換を使用することができます。
Re。 'while read 'ループ:OPが望むものなら' find ... -exec grep ... {} + |一方、読取りライン。パーサ "$ line"を行います。 doneは良い提案です。 –
@gniourf_gniourf提案していただきありがとうございます!私はあなたが気にしないなら、それを答えに加えました。 – PesaThe
これは私のために働いた: 'find。 -type f -exec grep -iPho "barh(li | mar | ag)" {} \; | IFS = read -r行です。パーサ "$ line"を行います。 done ' ... 「+」の代わりに「\;」が表示されます... と答えました。ありがとう。 –