Bash脚本:用文件替换字符' X"使用sed在两个给定字符串之间

时间:2017-01-26 00:30:17

标签: bash shell sed

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

请告诉我

3 个答案:

答案 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"

进一步阅读: