【问题标题】:Using 'sed' to find and replace ampersand (&) with problem [duplicate]使用“sed”查找和替换有问题的与号(&)[重复]
【发布时间】:2020-12-15 11:57:00
【问题描述】:

与符号 (&) 和 sed 的特殊情况

想用bash中的&字符串替换字符串

INPUT: 

var1=''XXX&XXX'
Input : sed -i 's/WW/$var1/g' test

Output:

$cat test
XXXWWXXX 

预期输出为:XXX&XXX

PS:字符串将由动态,所以在这里我不想用转义字符修改变量,任何解决方案 壳牌?

【问题讨论】:

  • 转义&,这是sed中的特殊元字符。所以使用:sed -i 's/WW/XXX\&XXX/g' test
  • 我刚刚更新了我的问题@anubhava
  • 是的,它的工作,但修改变量后,我不想做@anubhava
  • 斜杠 (/) 不是转义字符,反斜杠 (\) 是。
  • 如果您的输入是XXXWWXXX,并且您想用XXX&XXX 替换WW,那么预期的输出不应该是XXX&XXX,而应该是XXXXXX&XXXXXX

标签: regex linux bash shell sed


【解决方案1】:

像这样使用它:

var1='XXX&XXX'

# Use double quotes in sed
# Note: & is escaped
sed "s/WW/${var1//&/\\&}/g" <<< '123 WW foo WW xyz.'

输出:

123 XXX&XXX foo XXX&XXX xyz.

【讨论】:

  • 它会工作但字符串可以随时进行(它是动态的),所以每次都修改变量不是一个好主意。
  • 如果您可以在第一个发布的问题中看到已经提到 here i don't want to modify variable with / character(slash), Any solution in Shell ? 可能在历史上可用。感谢您的支持...保持对社区的帮助 :) 如果您认为,我发布的答案对用户有帮助,然后验证/接受。
  • 我相信您在问题中输入错误 / 并且 Ed 评论说 / 不用于转义但 \ 是
【解决方案2】:

既然您说i don't want to modify variable with / (sic) escape character - 这将对您要匹配的现有文本(WW)及其替换(XXX&amp;XXX)使用文字字符串匹配,这就是您避免在其中任何一个中转义任何字符的方法:

var1='XXX&XXX'
old='WW' new="$var1" awk '
    BEGIN {
        old = ENVIRON["old"]
        new = ENVIRON["new"]
        lgth = length(old)
    }
    {
        head = ""
        tail = $0
        while ( s = index(tail,old) ) {
            head = head substr(tail,1,s-1) new
            tail = substr(tail,s+lgth)
        }
        $0 = head tail
        print
    }
' test

请参阅How do I use shell variables in an awk script?,了解我如何使用 shell 和 awk 变量。

您不能使用 sed 执行上述操作,因为 sed 不理解文字字符串,因此如果您想使用 sed,请参阅 Is it possible to escape regex metacharacters reliably with sed

【讨论】:

  • 考虑一下,这里的String是动态的,那么怎么处理&amp;这个字符呢。
  • 您的问题中没有此处的字符串,因此请确定您所指的内容。如果只是文件test 可以是Here String 而不是文件,那么只需将test 替换为&lt;&lt;&lt; 'XXXWWXXX'。不知道你为什么要问这个 - 你的问题还有更多吗?
【解决方案3】:

发现解决方案是,在最近的 shell 中,可以这样做,

需要把这个//&amp;/\\&amp; 静态字符集来解决sed 的这个& 号问题

s1="XXX&XXX"

sed "s/ww/${s1//&/\\&}/g" <<< 'this is ww'

this is XXX&XXX

其他情况,

s2="&xx&xx&x&"

sed "s/ww/${s2//&/\\&}/g" <<< 'this is ww'

this is &xx&xx&x&

快速搜索发现了罪魁祸首;

The REPLACEMENT can contain \N (N being a number from 1 to 9, inclusive) 
references, which refer to the portion of the match which is contained 
between the Nth \( and its matching \). Also, the REPLACEMENT can contain 
unescaped & characters which reference the whole matched portion of the pattern space

让我们试试 awk

URI='https://user:pass@example.com/?num=42&type=magic'
$ echo 'my_link = %link%' | awk "{ gsub(/%link%/, \"$URI\"); print }"
my_link = https://user:pass@example.com/?num=42%link%type=magic

https://www.gnu.org/software/sed/manual/sed.html上查找更多详细信息

干杯!

【讨论】:

  • 您特别提到了i don't want to modify variable with / (sic) escape character,在这里您发布了一个使用转义字符修改变量的答案。您必须使用双转义和转义引号,因为您在脚本周围使用双引号而不是单引号 - 不要这样做,您的程序会变得更简单。此外,重要的是,请注意 &amp; 并不是唯一需要转义的字符,它出现在 s1 中 - 有几个。
猜你喜欢
  • 2012-09-22
  • 2020-08-05
  • 2014-03-09
  • 2021-10-06
  • 1970-01-01
  • 2019-11-29
  • 2020-12-23
  • 2018-10-01
  • 2017-11-11
相关资源
最近更新 更多