我想更改(通过使用SED命令的bash脚本)两个给定字符串之间的所有字符具有相同数量的X
个字符。如果说,第一个字符串是%26Name%3d
,最后一个字符串是%26
,那么我想要用相同数量的X
字符替换这两个字符串之间的任何内容。我正在阅读一个文件。该文件大约是1MB。
所以
SOMETHING%26Name%3dTHISTEXTNEEDSTOBE%26ELSE
到
SOMETHING%26Name%3dXXXXXXXXXXXXXXXXX%26ELSE
如果起始字符串为%26Last%3d
且结束字符串为%26
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
以上声明以及myAnd
和myEqual
。
示例:
SOME%26Name%3dTHISTEXTNEEDSTOBE%26Last%3dDUTTA
to
SOME%26Name%3dXXXXXXXXXXXXXXXXX%26Last%3dXXXXX
答案 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