如何确保插入到“ sed”替换中的字符串转义所有元字符

我有一个脚本,该脚本读取文本流并生成sed命令文件,该文件随后与一起运行sed -f生成的sed命令类似于:

s/cid:image002\.gif@01CC3D46\.926E77E0/https:\/\/mysite.com\/files\/1922/g
s/cid:image003\.gif@01CC3D46\.926E77E0/https:\/\/mysite.com\/files\/1923/g
s/cid:image004\.jpg@01CC3D46\.926E77E0/https:\/\/mysite.com\/files\/1924/g

假设生成sed命令的脚本类似于:

while read cid fileid
do
    cidpat="$(echo $cid | sed -e s/\\./\\\\./g)"
    echo 's/'"$cidpat"'/https:\/\/mysite.com\/files\/'"$fileid"'/g' >> sedscr
done

如何改善脚本以确保cid字符串中的所有正则表达式元字符均已转义并正确插值?

斯蒂芬·查泽拉斯(Stephane Chazelas)

为了逃避变量上的左侧和右侧可以使用s命令sed(这里$lhs$rhs分别),你会怎么做:

escaped_lhs=$(printf '%s\n' "$lhs" | sed 's:[][\\/.^$*]:\\&:g')
escaped_rhs=$(printf '%s\n' "$rhs" | sed 's:[\\/&]:\\&:g;$!s/$/\\/')

sed "s/$escaped_lhs/$escaped_rhs/"

请注意,$lhs不能包含换行符。

也就是说,在LHS上,转义所有正则表达式运算符(][.^$*),转义字符本身(\)和分隔符(/)。

在RHS上,您只需要转义&,分隔符,反斜杠和换行符(可通过在每行的末尾插入反斜杠(最后一行($!s/$/\\/除外)来完成此操作)。

这假设你用/在你的分隔符sed s的命令和你没有启用扩展的RE-r(GNU sed/ ssed/ ast/ busybox sed)或-E(BSD系统,ast最近GNU,最近busybox的)或PCREs-Rssed)或增强的RE-A/ -Xast),它都有额外的RE运算符。

处理任意数据时的一些基本规则:

  • 不要使用 echo
  • 引用您的变量
  • 考虑语言环境的影响(尤其是其字符集:例如,使用转义的字符串(并使用相同的命令),转义 sed命令在与该sed命令相同的语言环境中运行很重要sed
  • 不要忘了换行符(在这里您可能要检查是否$lhs包含换行符并采取措施)。

另一种选择是在环境中使用perl代替sed并传递字符串,并使用\Q/ \E perlregexp运算符从字面上接受字符串:

A="$lhs" B="$rhs" perl -pe 's/\Q$ENV{A}\E/$ENV{B}/g'

perl(默认情况下)不受语言环境字符集的影响,因为在上面,它仅将字符串视为字节数组,而无需关心它们可以为用户代表什么字符(如果有)。使用sed,您可以通过将所有命令的语言环境固定为CwithLC_ALL=C实现相同的目的sed(尽管这也会影响错误消息的语言,如果有的话)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何用转义字符替换字符串中的所有特殊字符?

来自分类Dev

如何替换字符串中的所有字符?

来自分类Dev

如何替换字符串中的所有空格

来自分类Dev

如何检查字符串中的所有字符是否都转义

来自分类Dev

如何用我的DataFrame中的空字符串替换所有“ nan”字符串?

来自分类Dev

如何替换bash中所有字符串中的特定子字符串?

来自分类Dev

如何停止 $ / 被剥离的字符串被插入到带有 sed 的文件中?

来自分类Dev

如何使用查找和替换用vscode中的kebab字符串替换所有驼峰式字符串

来自分类Dev

如何在golang中替换字符串中的所有字符

来自分类Dev

如何用字符串中的连字符替换所有数字?

来自分类Dev

如何替换Javascript中的所有字符串?特别是结合特殊字符

来自分类Dev

如何从PHP字符串中替换除数字(200、200.45等)以外的所有字符?

来自分类Dev

如何用数字和特殊字符替换字符串中的所有数字?

来自分类Dev

如何使用sed替换其中带有“ \”的字符串?

来自分类Dev

如何替换子字符串的所有实例,但仅替换JS中的整个世界?

来自分类Dev

如何使用R将所有转义字符保留在SQL字符串中以查询POSTGRES DB?

来自分类Dev

如何替换字符串y Python中不等于字符串x的所有内容?

来自分类Dev

如何用sed替换SQL文件中的字符串

来自分类Dev

当字符串中包含“ http://”时,sed如何替换?

来自分类Dev

如何用字符串替换转义字符

来自分类Dev

如何用RegularExpressions替换包含美元字符的MySQL字符串?

来自分类Dev

如何在Android中替换JSON字符串中的HTML转义字符

来自分类Dev

如果还没有转义字符串中的相关字符,该如何转义呢?

来自分类Dev

如何替换JavaScript中所有出现的字符串?

来自分类Dev

如何替换字符串的所有匹配项?

来自分类Dev

如何替换字符串的所有其他出现

来自分类Dev

如何替换JavaScript中所有出现的字符串?

来自分类Dev

jQuery如何替换所有字符串

来自分类Dev

使用 SED 流编辑器时如何转义字符串中的特殊字符

Related 相关文章

  1. 1

    如何用转义字符替换字符串中的所有特殊字符?

  2. 2

    如何替换字符串中的所有字符?

  3. 3

    如何替换字符串中的所有空格

  4. 4

    如何检查字符串中的所有字符是否都转义

  5. 5

    如何用我的DataFrame中的空字符串替换所有“ nan”字符串?

  6. 6

    如何替换bash中所有字符串中的特定子字符串?

  7. 7

    如何停止 $ / 被剥离的字符串被插入到带有 sed 的文件中?

  8. 8

    如何使用查找和替换用vscode中的kebab字符串替换所有驼峰式字符串

  9. 9

    如何在golang中替换字符串中的所有字符

  10. 10

    如何用字符串中的连字符替换所有数字?

  11. 11

    如何替换Javascript中的所有字符串?特别是结合特殊字符

  12. 12

    如何从PHP字符串中替换除数字(200、200.45等)以外的所有字符?

  13. 13

    如何用数字和特殊字符替换字符串中的所有数字?

  14. 14

    如何使用sed替换其中带有“ \”的字符串?

  15. 15

    如何替换子字符串的所有实例,但仅替换JS中的整个世界?

  16. 16

    如何使用R将所有转义字符保留在SQL字符串中以查询POSTGRES DB?

  17. 17

    如何替换字符串y Python中不等于字符串x的所有内容?

  18. 18

    如何用sed替换SQL文件中的字符串

  19. 19

    当字符串中包含“ http://”时,sed如何替换?

  20. 20

    如何用字符串替换转义字符

  21. 21

    如何用RegularExpressions替换包含美元字符的MySQL字符串?

  22. 22

    如何在Android中替换JSON字符串中的HTML转义字符

  23. 23

    如果还没有转义字符串中的相关字符,该如何转义呢?

  24. 24

    如何替换JavaScript中所有出现的字符串?

  25. 25

    如何替换字符串的所有匹配项?

  26. 26

    如何替换字符串的所有其他出现

  27. 27

    如何替换JavaScript中所有出现的字符串?

  28. 28

    jQuery如何替换所有字符串

  29. 29

    使用 SED 流编辑器时如何转义字符串中的特殊字符

热门标签

归档