我必须使用unix中的``sed''命令替换两个字符串之间存在的字符串

时间:2018-06-20 12:10:18

标签: unix sed

我必须在Unix中使用sed命令替换两个字符串之间存在的字符串。

我的输入是:

Apple'Mangoabcd'Orange'Mangoxyz'Lemon'

我使用的命令是

sed 's/Mango.*'"'"'/+XXXX'"'"'/'

我想要的输出是

Apple'XXXX'Orange'XXXX'Lemon'

我得到的输出是

Apple'XXXX'

我想在所有位置将'Mango+freetext'替换为'XXXX'

1 个答案:

答案 0 :(得分:0)

  1. 如果您只想替换Mango,而您知道它是Mango,那么您只需

    sed 's/Mango/XXXX/g'
    
  2. 如果要替换自由文本不包含单引号Mango<freetext>的{​​{1}},请执行以下操作:

    '

    我们在sed "s/'Mango[^']*/'XXXX/g" 之前添加了额外的引号,以确保排除诸如Mango

  3. 之类的字符串
  4. 如果要替换单词'SquashedMangoJuice'Apple之间的字符串,则必须做些不同:

    Orange

    或使用向后引用

    sed "s/Apple'[^']*'Orange/Apple'XXXX'Orange/g" 
    

原始命令失败的原因是sed "s/\(Apple'\)[^']*\('Orange\)/\1XXXX\2/g" 贪婪。我的意思是,组合sed将选择所有内容,直到最后一个引号为止。也就是说,它将代表.*'。罪魁祸首是Mango'Orange'之后的最后一个引号。上面,我们通过将您的Orange替换为.来解决此问题。这意味着除引号[^']以外的所有字符。