需要用 * 替换除前 3 个字符和后 3 个字符之外的字符串

需要用 * 替换除前 3 个字符和后 3 个字符之外的字符串

我想自定义一个带有 * 字符的字符串,除了字符串中的前 3 个和后 3 个字符,因为我不想在日志中打印这个字符串。

例如:如果字符串是abctextxyz,我希望将其更改为abc****xyz

我尝试打印除前 3 个字符和后 3 个字符外带有 * 的字符串,但将其硬编码为 7 个字母的字符串。我想将其自定义为任意长度。

如果字符串不超过 6 个字符,则应按原样打印。

这是我为此目的创建的 bash 脚本:

#!/bin/bash
STRING1="testabctest";
echo $STRING1;
STRING2=${STRING1:0:3};
echo $STRING2;
STRING3=${STRING1:(-3)};
echo $STRING3;
STRING4=$STRING2"****"$STRING3;
echo $STRING4 

答案1

使用字符串操作将字符串替换为星号。

$ a="abctextxyz"; \
  b="${a:3:$((${#a}-6))}"; \
  echo "${a:0:3}${b//?/*}${a:(-3)}"

答案2

此脚本用于sed用星号替换字符。它还用于bc计算应使用的星号数量并seq定义printf命令中的范围。

#!/bin/bash
STRING="fgdsfssa"
echo "$STRING"
STRING_LENGTH=${#STRING}

if [[ "$STRING_LENGTH" -lt 7 ]]; then
    echo "$STRING"
else
    ASTERISKS_LENGTH=$(echo $STRING_LENGTH - 6 | bc)
    ASTERISKS=$(printf "*%.0s" $(seq $ASTERISKS_LENGTH))
    FINAL_STRING="$(echo "$STRING" | sed -r "s/(.{3})(.*)(.{3})/\1$ASTERISKS\3/")"
    echo "$FINAL_STRING"
fi

相关内容