内部ループをより速くする方法は?

内部ループをより速くする方法は?

数日前、私は最初のシェルスクリプトを生成し、生成中にいくつかのファイルをテストし、完全に動作しました。しかし、実際には編集するファイルが12000個を超えるが、非常に遅いです。では、より速く作ることが可能でしょうか?この部分を短くしてみました。

grep -rl "${id[$j]}" ../usage --exclude-dir="*/.git*" --exclude=*.{png,jpg,pdf} --include=*.dita | xargs sed -i "s/_[0-9]\+\"/_$apps.$title\"/g";

grep -rl "${id[$j]}" ../usage --exclude-dir="*/.git*" --exclude=*.{png,jpg,pdf} --include=*.dita | xargs sed -i "s/_[0-9]\+\//_$apps.$title\//g";

しかし、オペレータと連携させることはできません。

grep -rl "${id[$j]}" ../usage --exclude-dir="*/.git*" --exclude=*.{png,jpg,pdf} --include=*.dita | xargs sed -i "s/_[0-9]\+\"/_$apps.$title\"/g" | xargs sed -i "s/_[0-9]\+\//_$apps.$title\//g";

私は&&演算子も試してみましたが、どちらの場合も私が持っているファイルに対して動作しましたが、最初の演算子が失敗してもsedが機能するには2番目の演算子が必要でした。

ご提案ありがとうございます。これは私のスクリプトです。

len_1=($(find . -name "*.dita" -not -path "*/.git*"))
len=${#len_1[@]}
echo -e "${CYAN}Found $len objects for modifying...${OUTPUT}"
#echo $len

for ((i=0; i<len; i++)); do
    id=($(grep -Po 'id="\K[^"]+' ${len_1[$i]}))
    echo -e "${CYAN}Modifying ${len_1[$i]}${OUTPUT}"
    apps=$(grep -Po 'appname="\K[^"]+' ${len_1[$i]}) && title=$(grep -Po '<title>\K.*?(?=</title>)' ${len_1[$i]} | head -1) && sed -i "s/_[0-9]\+/_$apps.$title/g" ${len_1[$i]} && sed -i "s/id=\"[0-9]\+\"\+/id=\"$apps.$title\"/g" ${len_1[$i]};

    if [ ${#id[@]} -gt 0 ]
    then
        for ((j=0; j<${#id[@]}; j++)); do
            echo -e "${RED}Searching for ${id[$j]}...${OUTPUT}"
            grep -rl "${id[$j]}" ../usage --exclude-dir="*/.git*" --exclude=*.{png,jpg,pdf} --include=*.dita | xargs sed -i "s/_[0-9]\+\"/_$apps.$title\"/g" ;
            grep -rl "${id[$j]}" ../usage --exclude-dir="*/.git*" --exclude=*.{png,jpg,pdf} --include=*.dita | xargs sed -i "s/_[0-9]\+\//_$apps.$title\//g";
        done
    else
        echo -e "${RED}Didn't found IDs...${OUTPUT}";
    fi
done

ベストアンサー1

"マッチングしたりキャプチャしてみては/いかがでしょうか?

sed -i "s/_[0-9]\+\([\"\/]\)/_$apps.$title\1/g"

またはもっと読みやすく、

sed -i "s=_[0-9]\+\([\"/]\)=_$apps.$title\1=g"

おすすめ記事