首页 > 解决方案 > 在 shell 脚本或 sed 中用特殊字符替换表达式

问题描述

在文件x中,包含的行将4*4 4*1 4*4 4*0被替换4*4 4*1 3*4 1*4 4*0为在文件中y。我正在使用以下代码:

#!/bin/bash
old=`grep "4*4" x`;
new=`grep "4*4" y`;
sed -i "s/${old}/${new}/g" x

但它根本没有产生任何变化x。我是新手,对于这个网站来说这可能是一个愚蠢的问题,但我无法用多个特殊字符替换这个表达式和另一个表达式。

标签: bashsedspecial-characters

解决方案


欢迎来到 stackOverflow - 一个非常棒的开发者平台
如果你坚持下去,你也会发现它非常有回报。

现在回答你的问题。

*是一个特殊字符,sed当它包含在要匹配的模式中时。更多信息在这里
因此,我们需要使用\.

您可以old=$(echo "${old}" | sed -r 's/[*]/\\*/g')对每个*内部变量使用类似的方法old

  • echo "${old}" |将变量的值提供oldsed.
  • sed让我以扩展形式编写命令:sed -r 's/ [*] / \\* /g'
    • -r因为我们使用regexin模式来匹配
    • [*]regex并且也是要匹配的模式信息
    • \\*替换字符串- 第一个\正在转义第二个\并被*视为普通字符。
  • $( )已用于将最终输出分配给变量old


这是修改后的脚本

#!/bin/bash

# Read the strings
old=`grep "4*4" x`;
new=`grep "4*4" y`;

# Escape * i.e. add \ before it - As * is a special character for sed
old=$(echo "${old}" | sed -r 's/[*]/\\*/g')

# Replace
sed -i "s/${old}/${new}/g" x

推荐阅读