Regex 匹配空格字符正则表达式
我有几个文件,其中包含以下格式的一系列内容:Regex 匹配空格字符正则表达式,regex,bash,unix,grep,Regex,Bash,Unix,Grep,我有几个文件,其中包含以下格式的一系列内容: [abc] #4 *5 [pqr] #3 *4 [xyx] #5 *2 现在我需要替换所有发生的 [xyx] #3 *2 借 在所有文件中 现在引起疼痛的问题是[xyz]和#3之间是否存在空间。我将此搜索表达式作为脚本中的命令行参数,如下所示: searchExp=$1 repalaceExp=$2 echo $searchExp echo $replaceE
[abc] #4 *5
[pqr] #3 *4
[xyx] #5 *2
现在我需要替换所有发生的
[xyx] #3 *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
searchExp=$1
repalaceExp=$2
sed -i "s/$searchExp/$replaceExp/" *
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
我想这应该没问题,因为我的论点是:
./replace_script '^\[xyz\] #3' '\[xyz\] #1'
现在,正如您看到的echo statment int一样,脚本将搜索和关系表达式中的所有空格缩减为单个空格
\[xyz\] #3
现在,我尝试了其他几种方法来处理空间角色
1. ^\[xyz\][ ]+#3
这是一个尖叫,不平衡[],所以正则表达式错误
2. ^\[xyz\]\s+#3 //as per few suggestion on SO
这不匹配
你能看出我错在哪里吗
编辑:更正的打字错误总是减少空格,所以不要指望它的输出 您真正缺少的是:
sed 's/searchExp/replaceExp' $i > $i.new
事实上应该是
sed "s/$searchExp/$replaceExp/" $i > $i.new
如果要确保实际匹配行,可以在for
循环中写入echo
(或者更好的是,printf
)
最后,如果要对所有文件使用sed
,并将替换到位,可以这样编写:
searchExp=$1
repalaceExp=$2
echo $searchExp
echo $replaceExp
for i in `grep \'$searchExp\'`
do
sed 's/$searchExp/$replaceExp' $i > $i.new
done
searchExp=$1
repalaceExp=$2
sed -i "s/$searchExp/$replaceExp/" *
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
echo
总是减少空间,所以不要指望它的输出
您真正缺少的是:
sed 's/searchExp/replaceExp' $i > $i.new
事实上应该是
sed "s/$searchExp/$replaceExp/" $i > $i.new
如果要确保实际匹配行,可以在for
循环中写入echo
(或者更好的是,printf
)
最后,如果要对所有文件使用sed
,并将替换到位,可以这样编写:
searchExp=$1
repalaceExp=$2
echo $searchExp
echo $replaceExp
for i in `grep \'$searchExp\'`
do
sed 's/$searchExp/$replaceExp' $i > $i.new
done
searchExp=$1
repalaceExp=$2
sed -i "s/$searchExp/$replaceExp/" *
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
更好的方法是使用带有反向引用的正则表达式,如下所示:
searchExp=$1
repalaceExp=$2
echo $searchExp
echo $replaceExp
for i in `grep \'$searchExp\'`
do
sed 's/$searchExp/$replaceExp' $i > $i.new
done
searchExp=$1
repalaceExp=$2
sed -i "s/$searchExp/$replaceExp/" *
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
searchExp='\(\[xyx\][[:space:]]*\)\35; 5'
replaceExp='\1#1'
sed“s/$searchExp/$replaceExp/”更好的方法是使用正则表达式和如下的反向引用:
searchExp=$1
repalaceExp=$2
echo $searchExp
echo $replaceExp
for i in `grep \'$searchExp\'`
do
sed 's/$searchExp/$replaceExp' $i > $i.new
done
searchExp=$1
repalaceExp=$2
sed -i "s/$searchExp/$replaceExp/" *
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
searchExp='\(\[xyx\][[:space:]]*\)\35; 5'
replaceExp='\1#1'
sed“s/$searchExp/$replaceExp/”空格可以由[:space:][/code>匹配空格可以由[:space:][/code>匹配!那是个打字错误。我正在使用sed的/$searchExp/$replaceExp/”。我纠正了这个问题。谢谢!另外,为了消除您的疑虑,$I>$I.new的意思是,默认情况下,sed不替换,而是打印在std o/p上,我正在尝试将其捕获到一个新文件中。希望这是有意义的。这也行不通。变量不是用单引号展开的,你需要双引号。@mawia,-i
会帮你解决这个问题。如果使用i.new
,它也会备份文件。请参阅sed
手册。请注意-i
是Gnu扩展,因此可能不可用。哎呀!那是个打字错误。我正在使用sed的/$searchExp/$replaceExp/”。我纠正了这个问题。谢谢!另外,为了消除您的疑虑,$I>$I.new的意思是,默认情况下,sed不替换,而是打印在std o/p上,我正在尝试将其捕获到一个新文件中。希望这是有意义的。这也行不通。变量不是用单引号展开的,你需要双引号。@mawia,-i
会帮你解决这个问题。如果使用i.new
,它也会备份文件。请参阅sed
手册。请注意-i
是Gnu扩展,因此可能不可用。