匹配空格字符正则表达式

时间:2012-05-24 14:58:33

标签: regex bash unix grep

我的文件系列很少,格式如下:

[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 statment int时,脚本会减少搜索中的所有空格并将表达式重新表达为单个空格

\[xyz\] #3

现在我尝试了其他几种替代空间角色的方法

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

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

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

这不匹配。

你能看到我出错的地方吗?

编辑:更正错字

2 个答案:

答案 0 :(得分: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

另请注意,您需要使用双引号来扩展变量。

答案 1 :(得分: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/" *