file=mylog.log
search_str="&Name="
end_str="&"
sed -i -E ':a; s/('"$search_str"'X*)[^X'"$end_str"']/\1X/; ta' "$file"
Ex 1:
something&Name=JASON&else
to
something&Name=XXXXX&else
实际上,我当前的sed命令工作正常,而不是'" $ end_str"'如果我使用'&'人物...像这样:
sed -i -E ':a; s/('"$search_str"'X*)[^X&]/\1X/; ta' "$file"
所以,总结一下,在^ X后如果单个字符比我给定的sed命令工作正常......但是相同的命令不起作用,如果不是字符,我使用字符串...
For example, my sed command won't work in this case :
end_str="\%26"
sed -i -E ':a; s/('"$search_str"'X*)[^X'"$end_str"']/\1X/; ta' "$file"
例如:
something&Name=JASON_MATTHEW_DONALD%26else
TO
something&Name=XXXXXXXXXXXXXXXXXXXX%26else
例如:2
something&Name=JASON%26else
TO
something&Name=XXXXX%26else
请告诉我
答案 0 :(得分:0)
将字符串变量放在字符类之外并捕获它以检查是否有进一步的替换:
sed -i -E ':a; s/('"$search_str"'X*)[^X](.*'"$end_str"')/\1X\2/; ta' "$file"
答案 1 :(得分:0)
如果X
的数量不重要,您可以将其简化为:
search="Name"
sed "s/$search=[^&]*/$search=XXX/" input.file
这假定$search
不包含在sed's
正则表达式语法中有意义的特殊字符。如果特殊字符可能成为问题,您需要准备$search
变量,如下所述:Is it possible to escape regex metacharacters reliably with sed
答案 2 :(得分:0)
我坚持认为在日志中保留密码的长度是一个非常糟糕的主意(安全方面)。
说完了:
首先,字符列表[...]
不是匹配字符串的正确工具。为此,我们需要使用交替值(...|...)
。
end_str="(&|%26)"
但很难表达一个"而不是一个字符串"在正则表达式。
not_end_str="([^&]|[^%]|%[^2]|%2[^6])"
使用我们可以构建一个纯粹的bash解决方案(可能不快,但有效) 它打印到stdout以显示它是如何工作的。 重定向到文件以存储结果。
file=mylog.log
search_str="&Name="
end_str="(&|%26)" # write end_str as an alternate value.
not_end_str="([^&]|[^%]|%[^2]|%2[^6])" # regex negate end_string.
# Build a regex that split each part of the text.
myreg="(.*${search_str}X*)(${not_end_str}*)([&%].*)"
while IFS=$'\n' read line; do
[[ $line =~ $myreg ]]
len=$((${#BASH_REMATCH[@]}-2)) # do not count [0] and last.
arr=("${BASH_REMATCH[@]:1}") # remove [0] and last.
arr[1]=${arr[1]//?/X} # Replace name with "X"'s.
arr[2]='' # Clear not_end_str match
printf '%s' "${arr[@]}"; echo # Print modified line.
done <"$file"
进一步阅读: