如何将 sed 与多个元字符一起使用

how to use sed with multiple meta characters

我正在尝试使用 sed 来做到这一点

sed -i.bak 's,[href="#">bebeco.fr],href="http://www.bebeco.fr,http://mm.eulerian.net/dynclick/bebeco/?eml-publisher=bebeco&eml-name=deme_faible&eemail={email}&eurl=https://www.bebeco.fr/?utm_source=ANIM&utm_medium=Targeting&utm_campaign=deme_faible&utm_term=CCCC_seg_men&utm_content=website">bebeco.fr,g' pour_test_demenagement-lien-faible.html

正如您所想象的那样,由于多个元字符,sed 命令行出现错误并且没有更改行。

如何解决这个问题而不是在每个元字符前加上 \

您认为awk可以提供帮助,而不需要编程吗?

TIA

我只想使用不同的分隔符。好老~呢?显示的数据不包含 ~:

sed 's~SEARCH~REPLACE~'

Do you think awk can help, without going into programming?

:) 由于awk是一门编程语言,我觉得不学编程是不行的。但是,我认为 sed 可以胜任这项工作。

您的正则表达式语法已被处理。 [href="#">bebeco.fr] 匹配 hre 等中的一个字符。最重要的是,您有三个字段,其中 sed 只允许二,所以不清楚你想要完成什么;但也许像

sed -i.bak 's,href="#">bebeco.fr,href="http://mm.eulerian.net/dynclick/bebeco/?eml-publisher=bebeco\&eml-name=deme_faible\&eemail={email}\&eurl=https://www.bebeco.fr/?utm_source=ANIM\&utm_medium=Targeting\&utm_campaign=deme_faible\&utm_term=CCCC_seg_men\&utm_content=website">bebeco.fr,g' pour_test_demenagement-lien-faible.html

即把href="#">bebeco.fr中双引号字符串中的hash替换成长URL.

您可以尝试创建和转义模式

MyStringSearch='ref="#">bebeco.fr'
MyStringSearchEsc="$( printf '%s' "${MyStringSearch}" | sed 's#\[]["\&*.\/+?]#\&#g' )"

MyStringReplace='href="http://mm.eulerian.net/dynclick/bebeco/?eml-publisher=bebeco\&eml-name=deme_faible\&eemail={email}\&eurl=https://www.bebeco.fr/?utm_source=ANIM\&utm_medium=Targeting\&utm_campaign=deme_faible\&utm_term=CCCC_seg_men\&utm_content=website">bebeco.fr'
MyStringReplaceEsc="$( printf '%s' "${MyStringReplace}" | sed 's#\[\/\&"]#\&#g' )"

在我们最后的 sed 中。

sed "s/${MyStringSearchEsc}/${MyStringReplaceEsc}/g"  pour_test_demenagement-lien-faible.html

您陷入了认为 sed 可以对字符串进行操作的陷阱。这不可以。它对带有附加 "special" 个字符的正则表达式进行操作。只需使用 awk,因为它支持字符串操作。以下是用新字符串替换旧字符串的方法:

awk -v old="original" -v new="replacement" 's=index([=10=],old){[=10=]=substr([=10=],1,s-1) new substr([=10=],s+length(old))}1' file

如果 sed 有办法像 grep 那样支持字符串,那就太好了 -F 但它没有。如果有一种更简洁的方法来用 awk 编写它也很好,但没有。因此,让我们接受它并按照支持它们的工具提供的字符串操作进行操作,而不是试图找到 "special" 有时会用作分隔符的字符并将转义序列拼凑在一起以尝试禁用正则表达式元字符。