几天前,我创建了第一个 shell 脚本,在创建过程中对几个文件进行了测试,它运行得非常完美。然而现在在实践中,我有超过 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"