用'X'替换一行中两个字符串之间的所有字符

时间:2017-01-27 00:06:45

标签: string bash shell sed

我想更改(通过使用SED命令的bash脚本)两个给定字符串之间的所有字符具有相同数量的X个字符。如果说,第一个字符串是%26Name%3d,最后一个字符串是%26,那么我想要用相同数量的X字符替换这两个字符串之间的任何内容。我正在阅读一个文件。该文件大约是1MB。

所以

SOMETHING%26Name%3dTHISTEXTNEEDSTOBE%26ELSE

SOMETHING%26Name%3dXXXXXXXXXXXXXXXXX%26ELSE  

如果起始字符串为%26Last%3d且结束字符串为%26

,则为OR
something%26Last%3d%2%2%4%2%4%3%5%%2%2%2%26else  

something%26Last%3dXXXXXXXXXXXXXXXXXXXXX%26else  

我在我的bash脚本中使用sed命令尝试了以下但是没有完美地运行。

file=mylog.log
myAnd=\\%26
myEqual=\\%3d
startList=Name\|Last
end_str="\%26"
search_str="$myAnd""(""$startList"")""$myEqual"

sed -i -E ':a; s/('"$search_str"'X*)[^X](.*'"$end_str"')/\1X\2/; ta' "$file"

PS startList=Name\|Last以上声明以及myAndmyEqual

示例:

SOME%26Name%3dTHISTEXTNEEDSTOBE%26Last%3dDUTTA  
to  
SOME%26Name%3dXXXXXXXXXXXXXXXXX%26Last%3dXXXXX  

3 个答案:

答案 0 :(得分:2)

这是一个sed解决方案:

sed -e :a -e 's/\(%26Name%3d[X]*\)[^X]\(.*%26\)/\1X\2/;ta'

答案 1 :(得分:1)

希望这就是你要找的东西。

正如您所提到的,startList只有file=/path/to/your/file declare -a arr=('%26Name%3d' '%26Last%3d') for i in "${arr[@]}"; do sed -i -e :a -e "s/\($i[X]*\)[^X]\(.*%26\)/\1X\2/;ta" $file; done 不同,我将代码设置为仅改变了这一点。使用单引号将其余变量添加到数组中,就像我添加的两个一样。

脚本:

$ cat script.sh
file=/home/siju/Desktop/test
declare -a arr=('%26Name%3d' '%26Last%3d')
for i in "${arr[@]}";
do
sed -i -e :a -e "s/\($i[X]*\)[^X]\(.*%26\)/\1X\2/;ta" $file;
done
$ 
$ cat test
SOMETHING%26Name%3dTHISTEXTNEEDSTOBE%26ELSE  
something%26Last%3d%2%2%4%2%4%3%5%%2%2%2%26else 
$ 
$ ./script.sh 
$ cat test
SOMETHING%26Name%3dXXXXXXXXXXXXXXXXX%26ELSE  
something%26Last%3dXXXXXXXXXXXXXXXXXXXXX%26else 

详细会话输出:

<embed src="http://turkchat.nl/newturkchat/turkchat/wp-content/themes/rt_oculus_wp/swf/Ov1.swf"
   type="application/x-shockwave-flash" width="358" height="240" align="middle" 
   name="Ov1/Ov1" autoPlay="1"></embed>

答案 2 :(得分:0)

perl的s///运算符允许您使用e标记评估替换部件中的perl代码

perl -e '
    my @strings = qw{
        SOMETHING%26Name%3dTHISTEXTNEEDSTOBE%26ELSE
        something%26Last%3d%2%2%4%2%4%3%5%%2%2%2%26else
    };
    my $start = q{%26(?:Name|Last)%3d};
    my $stop = q{%26};
    for my $str (@strings) {
        (my $copy = $str) =~ s/$start\K(.*?)(?=$stop)/"X" x length($1)/ge;
        print "$str\n$copy\n";
    }
'
SOMETHING%26Name%3dTHISTEXTNEEDSTOBE%26ELSE
SOMETHING%26Name%3dXXXXXXXXXXXXXXXXX%26ELSE
something%26Last%3d%2%2%4%2%4%3%5%%2%2%2%26else
something%26Last%3dXXXXXXXXXXXXXXXXXXXXX%26else
相关问题