リストへのコマンドの適用

リストへのコマンドの適用

リスト(またはより正確には、別々の項目として処理したい部分文字列が新しい行で区切られた文字列)に特定の単純な関数を適用する必要があることがよくあります。たとえば、stringToBeSearched適切なファイル名のリストを取得する簡単な解決策は次のとおりです。

grep -l "stringToBeSearched" *

それから、あなたが望む部分文字列を受け入れる他の関数にそれを供給したいと思います。これを試して実行するために、私は例えば次のように定義しました。

 f () { echo $(sed 's/begin-\([0-9]*\).end/\1/' <<<$1) ;}

たとえば、ファイルから数字を抽出する必要がありますbegin-123.end。このような関数は再利用されないので、定義するのを避けたいのですが、Mathematicaではいわゆる純粋な関数に対応する関数、つまり#1 + #2 & forの型が見つからないようです。匿名関数に2つの引数を一緒に追加します。

この関数は文字列に適用されるときに私が望むことをするので、残りの唯一のステップはそれを正しい文字列リストに適用することです。使えると思います。

  grep -l "stringToBeSearched" * | xargs -n1 f

xargsが関数fについて知らないので、これはうまくいかないようです。範囲が間違っていると思います。提案された解決策はf(https://stackoverflow.com/a/11003457/7238575)しかしそれは役に立たないようです。その他(https://stackoverflow.com/questions/11003418/calling-shell-functions-with-xargs)は新しいbashインスタンスも呼び出す必要があることを示唆しています。

しかし、私が試してみると

grep -l "stringToBeSearched" * | xargs -n1 bash -c f

ちょうど白い行のリストを印刷します。

明らかに、関数fをリストに適用するのと同じように、単純な操作を実行するより簡単な方法が必要です。


入力と出力の例:textを含むファイルがありますstringToBeSearched。 1つは名前で呼び出され、begin-1.end1つは名前で呼び出されますbegin-2.end。このファイルが含まれていないstringToBeSearchedアイテムに隠されているとしましょう。stringToBeSearchedしたがって、この場合は1と2を含むリストを取得したいと思います。理想的には、上記の機能をf2これらの機能に適用する簡単な方法も必要です。それで結局は走ることができるようになってほしいf2 1f2 2


これがXYの質問なら、技術的な質問に対する答えではなく、これがまったく方法ではない理由を説明する答えが欲しいです。質問のポイントは、私が探している数字を見つける方法ではありません(私は答えが欲しいが)。リストに関数を適用する一般的な方法が何であるかを尋ねます。上記の特定の問題は、リストの操作に関数を適用する必要がある問題の一例にすぎません。リストに関数を適用できない問題を説明するためのものです。これは本質的に主な問題ではありません。

ベストアンサー1

リストに関数を適用するには、そのリストを繰り返すだけです。

list=(one two 'twenty one' banana)

f() {
    echo "This is f applied to '$1'"
}

for item in "${list[@]}"
do
    f "$item"
done

(スペース)で区切られたリストがある場合は、それを配列(リスト)に変換するか、段階的に実行できます。ワイルドカード(*、、、?... [)を含むここに引用符がないリストのすべての項目は、]現在のディレクトリのコンテキストで通常どおりに評価されるため、最初にその配列を無効にする必要があります(これは非常に便利な妥当な理由です)。区切り文字列の代わりに /list):

text='one two twenty-one banana'

OIFS="$IFS" IFS=' ' OSHELLOPTS="$SHELLOPTS"
set -o noglob

for item in $text
do
    f "$item"
done

IFS="$OIFS"
[[ ! "$OSHELLOPTS:" =~ [=:]noglob: ]] && set +o noglob

バリエーションが多いです。コロンで区切られたリストは次のとおりです。

text='one:two:twenty one:banana'

OIFS="$IFS" IFS=':' OSHELLOPTS="$SHELLOPTS"
set -o noglob
...

おすすめ記事