sedの解析された出力を渡して(この方向に)

sedの解析された出力を渡して(この方向に)

さて、私の考えでは、このプラットフォームでパイプを接続する方法に関する何十もの質問を見つけることができるようです。find 出力しかし、sedこれまで反対方向では何も見つかりませんでした。私がしたいことは私のものを修正することです。入力するそれからに渡してくださいfind

退屈なアスタリスクのワイルドカードを入力しないようにすることで、私の人生をより簡単にするために、次のことをしたいとします。 (この文字列演算子の後にある式が最終的にスクリプトの後半でパラメータに<<<置き換えられる予定であることが明らかであることを願っています。以下の行はデモ用にのみ提供されています。)$1

$ sed 's/ /\*/g' <<< ' foo bar baz ' | find . -type f -iname - 

-実際、この行の終わりはしなければならない出力をsed入力として使用してくださいfind。ただし、findそのセクションを次に展開します。

... find -D tree . -type f -iname - ... 

このパラメータを表示します。いいえパイプを使用して前処理された入力を渡すことができない可能性がfindあります。find

答え1

find引数は標準入力ではなくコマンドラインから取得されます。したがって、次のようになります。

find . -iname "$(sed 's/ /\*/g' <<< ' foo bar baz ')"

それは次のとおりです。

find . -iname "foo*bar*baz*"

(シェルがワイルドカードfoo * bar * bas *を拡張するのを防ぐために引用符が必要です)

これはあなたが望むものかもしれないし、そうでないかもしれません。たとえば、foo、bar、またはbazで始まるファイルが必要ですが、「foo * bar * baz *」パターンに一致するファイルは、望ましくない場合は正規表現を設定し、代わりにor-regexを使用する必要があります。または、次のように、より複雑な検索コマンドを作成します。-iregex-iname-iname 'foo*' -o -iname 'bar*' -o -iname 'baz*'

または:

PATTERN='foo bar baz'
PATTERN=$(echo "$PATTERN" | sed -e 's/ /*/g')
# and/or do whatever else you need to do to transform $PATTERN to be what
# you need it to be...
find . -iname "$PATTERN"

これはbashスクリプトのコード行です。コマンドラインと同様に、スクリプトでもまったく同じように動作します。

$ cat ./test.sh
#! /bin/bash 
find . -iname "$(sed 's/ /\*/g' <<< ' foo bar baz ')"

$ ls -l
total 4
-rw-r--r-- 1 cas cas  0 Sep 26 16:53 doesntmatch
lrwxrwxrwx 1 cas cas 16 Sep 26 16:59 symlink -> xfoo-ybar-zbaz01
-rwxr-xr-x 1 cas cas 69 Sep 26 16:50 test.sh
-rw-r--r-- 1 cas cas  0 Sep 26 16:50 xfoo-ybar-zbaz01
-rw-r--r-- 1 cas cas  0 Sep 26 16:50 xfoo-ybar-zbaz02
-rw-r--r-- 1 cas cas  0 Sep 26 16:50 xfoo-ybar-zbaz03

$ ./test.sh 
./xfoo-ybar-zbaz01
./xfoo-ybar-zbaz03
./xfoo-ybar-zbaz02

$ find . -iname "$(sed 's/ /\*/g' <<< ' foo bar baz ')"
./xfoo-ybar-zbaz01
./xfoo-ybar-zbaz03
./xfoo-ybar-zbaz02

$ find . -iname "*foo*bar*baz*"
./xfoo-ybar-zbaz01
./xfoo-ybar-zbaz03
./xfoo-ybar-zbaz02

答え2

forループを使用しないのはなぜですか?

for n in $(sed 's/ /\*/g' <<< ' foo bar baz '); do find . -iname $n; done

関連情報