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扩展,因此可能不可用。