我的文件系列很少,格式如下:
[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
这不匹配。
你能看到我出错的地方吗?
编辑:更正错字
答案 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/" *