【问题标题】:Sed command to replace a string which has a special character "&"sed 命令替换具有特殊字符“&”的字符串
【发布时间】:2015-02-18 16:49:11
【问题描述】:

test.csv 的内容是:

XYZ,IN123

这是我的脚本:

Var1=IN123
Var2=A&B
sed -i "s/$Var1/$Var2/g" test.csv

这是我替换test.csv内容的简单代码,当代码找到IN123时,将替换为A&B。

所以预期的输出是:

XYZ,A&B

但是通过上面的代码,我得到了:

XYZ,AIN123B

我做错了什么?

【问题讨论】:

    标签: bash shell awk sed


    【解决方案1】:

    由于问题询问如何使用 SED 完成此操作,因此有一个鲜为人知的功能在这里非常有用 - 分隔符可以是任何你想要的,只要它们是不在您的替换字符串中。

    所以你可以这样做

    sed -i "s|$Var1|$Var2|g" test.csv
    

    ..并且可以将其替换为 $ 或 : 或您喜欢的任何其他内容。

    【讨论】:

    • 我希望我能给你+10,这对我帮助最大!现在 sed 对我来说看起来很干净而且很好!非常感谢你!
    • 但是...如果我错了,请纠正我,这不适用于每个 sed 语句,例如:sed '/pattern/i line1' file.txt,但在修改后的版本中它不起作用:sed ':pattern:i line1' file.txt
    【解决方案2】:

    不幸的是,& 在 sed 替换字符串中具有特殊含义,这让您感到困惑。它是一个元字符,意思是“匹配的整个模式”。为了获得文字 & 符号,您必须将其转义:

    Var1='IN123'
    Var2='A\&B'
    sed -i "s/$Var1/$Var2/g" test.csv
    

    单引号是防止\& 在赋值中被解释为转义序列所必需的。为了对称,我将它们添加到两个变量中。

    【讨论】:

    • 嗨,Tom,这是我发布的示例内容。我实际上是从两个输入文件中执行此操作的。第一个文件有 Var1,Var2,第二个文件是相同的 test.csv。你的意思是在输入文件本身,我必须处理这个?我需要用“\&”替换“&”?
    • @JavaProgrammer 如果你想使用 sed,那么可以。但是,鉴于您的问题的全部细节,听起来有更好的选择。您应该编辑您的问题以显示您的文件示例和所需的输出。
    【解决方案3】:

    如果您不想处理正则表达式和转义,请像这样使用awk

    Var1='IN123'
    Var2='A&B'
    awk -v v1="$Var1" -v v2="$Var2" 'BEGIN{FS=OFS=","} $2==v1{$2=v2} 1' test.csv
    XYZ,A&B
    

    【讨论】:

    • 你能扩展一下吗?特别是……嗯,整个awk 声明。我看到-vBEGIN 块提供了一个变量,并且该块在分配后执行。然后是 FS 和 OFS(输出字段分隔符),但这部分发生了什么:$2==v1{$2=v2} 1
    • $2==v1 检查第二列是否等于v1{$2=v2} 将第二列设置为v2
    • 好的,我明白了。最后的1 是什么?
    • 1 用于打印数据。
    • 我已经在 Linux 和 Mac 上检查过了,这并没有我希望的那样有效。自从这篇文章以来,AWK 中可能发生了一些变化,有人可以解决这个问题吗?
    【解决方案4】:

    & 是一个特殊字符,因此,您需要使用 \ var2需要这样指定

    Var2="A\&B"

    【讨论】:

    • 嗨 Vargan,这是我发布的示例内容。我实际上是从两个输入文件中执行此操作的。第一个文件有 Var1,Var2,第二个文件是相同的 test.csv。你的意思是在输入文件本身,我必须处理这个?我需要用“\&”替换“&”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 2021-11-17
    • 2020-08-26
    • 1970-01-01
    相关资源
    最近更新 更多