【问题标题】:find and replace using sed command使用 sed 命令查找和替换
【发布时间】:2018-10-01 15:10:49
【问题描述】:

我想在双引号之间找到单引号 ' 并使用 sed 命令将其替换为(反斜杠单引号)\' '

输入 = 'gender':"Men's",'colour':'Red','name':"Men's levi's"

输出 = 'gender':"Men\' 's",'colour':'Red','name':"Men\' 's levi\' 's"

我试过这个,我可以用管道替换逗号,但是当尝试用 \' ' 替换单引号时它不起作用:

sed 's/(\"[^"\'']\{1,\}),([^"\'']\{1,\}\")/\1 | \2/g' test.csv

【问题讨论】:

  • 你介意展示你的努力吗?
  • @revo 我试过这个,我可以用管道替换逗号,但是当尝试用 \' ' 替换单引号时它不起作用 sed 's/(\"[^"\''] \{1,\}),([^"\'']\{1,\}\")/\1 | \2/g' test.csv ...我是 sed 的新手,所以我真的不知道如何以正确的方式进行操作
  • 我已经回答了您的问题,希望对您有所帮助。老实说,你的问题标题有点含糊,但我这么说只是为了帮助避免那些可怕的“反对票”,如果这对你很重要的话。祝你好运!还有另一个 Stack 社区,称为 Unix 和 Linux。您的问题可能更适合那里?
  • awk 添加到标签不是一个好主意,因为OP 明确表示sed 无处不在。

标签: regex linux unix awk sed


【解决方案1】:

这是一种使用awk的方法:

awk 'BEGIN{FS=OFS=","} {
  for (i=1; i<=NF; i++)
     if (split($i, a, / *: */) == 2 && a[2] ~ /^"/) {
        gsub("\047",  "\\\047 \047", a[2])
        $i=a[1] ":" a[2]
     }
} 1' file

'gender':"Men\' 's",'colour':'Red','name':"Men\' 's levi\' 's"

【讨论】:

  • @johnny_moss 不代表其他相关回答无济于事!
  • @revo:绝对。但是 OP 指定了 sed,这就是我的观点。你可以用无数种方式回答这个问题。我只是想遵守论坛协议;我很欣赏他们的特殊性。
  • @anubhava 非常感谢您的解决方案正在运行,虽然我正在寻找 sed 命令,但我感谢您的努力。
  • @johnny_moss 人们会在他们的问题中提出各种古怪的问题,这通常意味着他们知道的就是这些,这不是不建议可能更好的方法的理由。
【解决方案2】:

使用用于多字符 RS 和 RT 的 GNU awk,您只需要:

$ awk -v RS='"[^"]+"' '{gsub(/\047/,"\\\047 \047",RT); ORS=RT} 1' file
'gender':"Men\' 's",'colour':'Red','name':"Men\' 's levi\' 's"

【讨论】:

    【解决方案3】:

    使用sed,您可以这样做:

    sed -e ":a"
        -e "s/'\([^\\\":]*\(\\.[^\\\":]*\)*\"\)/\\\\\f \f\1/"
        -e "ta"
        -e "s/\\\\\f \f/\\\' '/g" file
    

    换行和缩进是为了便于阅读。重点是你首先匹配单引号,然后是双引号(可能不是立即),用 \\\f \f 替换它(\\ 文字反斜杠,\f 换页)做同样的事情使用一个循环(t)然后你用你想要的字符串替换之前的替换。主正则表达式还负责处理双引号字符串中的转义双引号,但如果您在其中包含冒号 : 或逗号 ,,它将失败。

    单线:

    sed -e ":a" -e "s/'\([^\\\":]*\(\\.[^\\\":]*\)*\"\)/\\\\\f \f\1/" -e "ta" -e "s/\\\\\f \f/\\\' '/g" file
    

    【讨论】:

    • 经济不是一个因素吗?是不是最短、最有效的方法、解决方法?有什么答案吗?
    • @revo 非常感谢它对我的帮助!
    • @johnny_moss 我不会为了更短、不精确的解决方案而牺牲精度。如果答案不涵盖真实案例,那么它是否简短并不重要。简单地说,这不可能是一个答案。我不确定您所说的经济是否是一个因素? 但从性能角度讲,除了精度之外,这并没有忽视性能。
    猜你喜欢
    • 2012-12-29
    • 1970-01-01
    • 2015-04-01
    • 2020-08-05
    • 2022-01-10
    • 2012-12-30
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    相关资源
    最近更新 更多