1

好吧,我有几个文件包含以下格式的一系列内容:

[abc]           #4  *5
[pqr]           #3  *4
[xyx]           #5  *2

现在我需要替换所有发生的

[xyx]          #3  *2

经过

[xyx]          #1  *2

在所有文件中。

现在导致痛苦的问题是 [xyz] 和#3 之间存在空间。有两件事我将此搜索表达式作为脚本中的命令行参数,如下所示:

searchExp=$1
repalaceExp=$2

echo $searchExp
echo $replaceExp

for i in `grep \'$searchExp\'` 
do
 sed 's/$searchExp/$replaceExp' $i > $i.new
done

我想这应该没问题,因为我将参数传递为:

./replace_script '^\[xyz\]          #3' '\[xyz\]          #1'

现在,正如您在脚本中看到的 echo 语句将搜索和替换表达式中的所有空格减少到一个空格

\[xyz\] #3

现在我尝试了其他几种方法来处理空间字符

 1.   ^\[xyz\][ ]+#3

这是一个尖叫不平衡的[],所以正则表达式错误

 2. ^\[xyz\]\s+#3 //as per few suggestion on SO

这不匹配。

你能看出我哪里错了吗?

编辑:纠正错字

4

2 回答 2

4

更好的方法是使用带有反向引用的正则表达式,如下所示:

searchExp='\(\[xyx\][[:space:]]*\)#5'
replaceExp='\1#1'
sed "s/$searchExp/$replaceExp/" <<%EOF%
[abc]           #4  *5
[pqr]           #3  *4
[xyx]           #5  *2
%EOF%
[abc]           #4  *5
[pqr]           #3  *4
[xyx]           #1  *2

还要注意,要扩展的变量需要双引号。

于 2012-05-24T15:15:24.980 回答
0

echo总是减少空间,所以不要指望它的输出。

您真正缺少的是:

sed 's/searchExp/replaceExp' $i > $i.new

实际上应该是

sed "s/$searchExp/$replaceExp/" $i > $i.new

如果你想确保你确实匹配了这些行,你可以在循环中编写echo(或更好的printf) 。for

最后,如果你想sed在所有文件上使用并就地替换,你可以这样写:

searchExp=$1
repalaceExp=$2

sed -i "s/$searchExp/$replaceExp/" *
于 2012-05-24T15:04:20.220 回答