bash - 在 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
。我是新手,对于这个网站来说这可能是一个愚蠢的问题,但我无法用多个特殊字符替换这个表达式和另一个表达式。
解决方案
欢迎来到 stackOverflow - 一个非常棒的开发者平台
如果你坚持下去,你也会发现它非常有回报。
现在回答你的问题。
*
是一个特殊字符,sed
当它包含在要匹配的模式中时。更多信息在这里。
因此,我们需要使用\
.
您可以old=$(echo "${old}" | sed -r 's/[*]/\\*/g')
对每个*
内部变量使用类似的方法old
。
echo "${old}" |
将变量的值提供old
给sed
.sed
让我以扩展形式编写命令:sed -r
's/
[*]
/
\\*
/g'
-r
因为我们使用regex
in模式来匹配。[*]
是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
推荐阅读
- android - wrap_content 破坏了我的约束布局的性能
- c# - Protobuf 解组任意消息。Protobuf 消息多态性
- processing - 如何通过单击放大 Mandelbrot 集
- javascript - 如何在javascript中转义字符串中的多个引号
- python - 如何正确定义烧瓶 SERVER_NAME 以进行部署
- node.js - Nodejs异步跳过等待
- lua - 我打破了这个 lua 脚本
- ms-access - 访问表达式帮助 - 计算字段
- tensorflow - Tensorflow:批量太大时OOM
- c++ - 在 C++ 中将 int 作为 bool 参数传递