转义sed替换模式字符串

本文首发于我的Github博客
本文记录了作者在使用sed命令进行文本替换时,对于使用到的替换模式进行转义处理使用到的sed命令,简单来说:

  • 使用sed -e 's/[]\/$*.^[]/\\&/g'即可对输入字符串进行转义

场景

sed命令常常被用来对文本做处理,其中一个最经常用到的处理就是替换,替换的语法如下:

echo $STRING | sed -e 's/<match_pattern>/<replace_pattern>/g'

当然也可以有其他的变化,不过这是作者使用的最多的方式。

在使用这些的时候,我们可能会在match_patternreplace_pattern中引用变量,已达到分别管理和增强可读性的目的,比如

# dummy text
TEXT="affaflns,fakfnakn"
REPLACE="ff"
REPLACED_TEXT=$(echo $TEXT | sed -e "s/a/$REPLACE/g")

但是,如果上面引用的REPLACE里面有特殊字符,我们就会遇到问题,比如

# dummy text
TEXT="affaflns,fakfnakn"
REPLACE="/a"
# 有问题
REPLACED_TEXT=$(echo $TEXT | sed -e "s/a/$REPLACE/g")

我们的本意是将a替换为/a,但是,使用这几条命令,会得到

sed: 1: "s/a//a/g
": bad flag in substitute command: 'a'

这里的原因就是/a中的/是一个特殊字符,如果希望得到我们上述的效果,应该这么操作

# dummy text
TEXT="affaflns,fakfnakn"
REPLACE="\/a"
# 成功
REPLACED_TEXT=$(echo $TEXT | sed -e "s/a/$REPLACE/g")

我们通过\/进行转义,取得了成功,但是这种方式使得我们编写replace_pattern变得麻烦,而且很不直观,我们希望有一个函数来达到如下效果

# dummy text
TEXT="affaflns,fakfnakn"
REPLACE="/a"
REPLACE=$(func $REPLACE)
REPLACED_TEXT=$(echo $TEXT | sed -e "s/a/$REPLACE/g")

也就是说,编写replace_pattern时,可以直接编写,而后使用一个函数或者命令自动转义再使用

解决方案

stackoverflow

使用sed -e 's/[]\/$*.^[]/\\&/g'即可

方案解析

我们这次的方案就是对原生的replace_pattern做一次替换:

  • match_pattern[]\/$*.^[]
    • 这个正则表达式的结构很具有迷惑性,其实它是一个大的bracket group
    • 也就是说,实际上是[ ]\/$*.^[ ]的结构
    • 意味着匹配]\/$*.^[中的任一字符
  • replace_pattern\\&
    • 这个replace_pattern用到了一个转义字符和一个特殊字符
    • 转义字符\\表示的就是\
    • 特殊字符&表示的是match_pattern匹配到的内容

综合起来,这个替换语句就是把]\/$*.^[前面全部加上一个斜杠,进行转义

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: sed命令可以用来替换字符串中的字符。具体操作如下: 1. 用sed命令打开需要替换的文件,例如: ``` sed -i 's/oldstring/newstring/g' filename ``` 其中,-i选项表示直接修改文件,oldstring表示需要替换的字符,newstring表示替换后的字符,g表示全局替换。 2. 如果需要替换多个文件,可以使用通配符,例如: ``` sed -i 's/oldstring/newstring/g' *.txt ``` 这样就可以替换所有txt文件中的oldstring为newstring。 3. 如果需要替换的字符中包含特殊字符,需要使用转义符号,例如: ``` sed -i 's/\/home\/user\/oldstring/\/home\/user\/newstring/g' filename ``` 其中,\/表示/字符的转义。 希望以上回答能够帮到您。 ### 回答2: sed是一种流编辑器,常用于对文本进行编辑和转换。其中一个常见的功能就是对字符串中的字符进行替换。在sed中,可以使用s命令来进行替换操作。 s命令的基本格式为:s/pattern/replacement/options 其中,pattern表示要匹配的字符串模式,它可以是一个正则表达式。replacement表示要替换成的字符串,options则是可选参数,可以控制替换的方式和范围。 例如,要将文本文件中所有的"apple"替换成"orange",可以使用以下命令: sed 's/apple/orange/g' filename 在这个命令中,s表示替换操作,/g表示全局替换。这样,sed将会匹配所有的"apple"字符串,并将它们替换成"orange"。 除了直接替换字符串外,sed还支持一些高级替换操作。比如,在替换文本时,可以使用正则表达式来匹配更加复杂的模式。此外,还可以使用替换命令来删除或插入内容,以及将替换结果保存到文件中。 总之,sed是一个非常强大的字符串替换工具,可以帮助我们高效地编辑和处理文本文件。在处理大量文本时,掌握sed的基本用法和高级技巧,将为我们的工作带来很大的便利。 ### 回答3: sed是一种流编辑器,用于对文本进行处理并进行替换、删除、添加等操作。在sed中,替换字符串中的字符是一种常见的操作。下面介绍sed替换字符串中的字符的基本语法和用法。 语法格式: ``` sed 's/要替换的字符/替换成的字符/g' 文件名 ``` 其中,s为替换字符串的命令,/要替换的字符/为要替换的字符,/替换成的字符/为要替换成的字符,g为全局替换标志,表示替换所有出现的目标字符串,如果不加g标志,则只替换第一个出现的目标字符串。文件名为要执行替换操作的文件名,如果不指定文件名,则默认使用标准输入。 例如,执行以下命令: ``` sed 's/old/new/g' input.txt ``` 表示要替换input.txt文件中所有的old为new。 除了简单的字符替换外,sed还支持正则表达式的替换操作。例如,执行以下命令: ``` sed 's/^[a-z]/&\./g' input.txt ``` 表示要将input.txt文件中所有以小写字母开头的行的第一个字符替换为此字符和一个点,即在每个匹配字符前添加一个点。 此外,sed还支持将替换后的结果写入新文件、替换某一行的某个字符等高级用法。在使用sed进行字符串替换时,需要注意正则表达式的使用和目标字符串的特殊字符转义

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值