2014-09-29 167 views
0

当我试图用不同的多个单词替换多个单词并用空格分隔时,我在mac os上收到错误“unterminated substitute pattern”。我正在做一个bash脚本。从csv中读取以替换文件中的一组字符串。Bash sed多字查找和替换

例如

while IFS=, read col1 col2 col3 

#$col1=FOO BAR 
#$col2=another set of words 
#$col3=file 

do 
    REGX="'s|$col2|$col3|g'" 
    sed -i -e $REGX $col1 
done < $config_file 

我所要的输出是似乎“另一组词”不找出如何让在表达的空间。

感谢

+1

你能举一些真实的例子吗?目前的语法是好的,但你可能有一些斜线或奇怪的字符,打破了'sed'命令。 – fedorqui 2014-09-29 13:08:31

+0

我已经更新到我真的在做什么,因为我认为它是通过bash运行的。 – 2014-09-29 13:44:03

+0

我设法通过使用eval“sed -i -e $ REGX $ col1”来实现它,但是有一种跳跃方式。我认为bash并没有在声明中加入''。 – 2014-09-29 13:46:12

回答

1

您正在定义的替代变量中这样做,你以后使用于:

REGX="'s|$col2|$col3|g'" 
sed -i -e REGX col3 

又如:

$ cat a 
hello this is a test 
$ REGX="s/this/that/g" 
$ sed $REGX a 
hello that is a test 

不过,我会直接使用命令如下:

while IFS=, read -r col1 col2 col3 
do 
    sed -i.bak -e "s|$col2|$col3|g" $col1 
done < $config_file 

注:

  • 使用-rread,以避免极端情况怪异的情况。
  • sed中使用双引号,以便评估表达式中的变量。否则,它将查找文字$col2,并按照文字$col3进行更改。
  • 使用-i.bak创建备份文件时使用-i。否则,如果您尝试失败,您将失去原始文档。
+0

对不起在问题中的typeo我只是错过了问题中的$。你的解决方案是正确的,但不是那个错误。我已经更新了这个问题。 – 2014-09-29 14:02:35

+0

果然,@StuartCampbell。我从我的答案中删除了这个参考。 – fedorqui 2014-09-29 14:04:51

0
sed -i "s#foo bar#another set of words#g" 
# OR 
sed -i "s#foo|bar#another string#g" 

使用sed |为正则表达式OR,使用另一个分隔符(默认/套件以及这里也)

+1

这是不正确的。你试过了吗? 'sed -i“s | foo bar |另一组词| g”文件“完美地工作。 – fedorqui 2014-09-29 13:15:07

+0

无法在我的AIX上测试,但sed在MAC上,这不是纯粹的GNU sed也不是shell。在标准的GNU上,你是对的,默认情况下不使用扩展正则表达式。消息是告诉'未终止...',所以sed找不到分隔符 – NeronLeVelu 2014-09-29 13:19:26

+0

......这与您所回答的内容没有任何关系:) – fedorqui 2014-09-29 13:20:13