내부 루프를 더 빠르게 만드는 방법은 무엇입니까?

내부 루프를 더 빠르게 만드는 방법은 무엇입니까?

며칠 전 나는 첫 번째 쉘 스크립트를 생성하고 생성 중에 몇 개의 파일에 대해 테스트했으며 완벽하게 작동했습니다. 그러나 실제로는 편집할 파일이 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가 작동하려면 두 번째 연산자가 필요했습니다.

귀하의 제안에 감사드립니다. 이것은 내 스크립트입니다.

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"

관련 정보