【问题标题】:Find replace with sed with an excess of quotation marks查找替换为带有多余引号的 sed
【发布时间】:2019-03-20 18:21:33
【问题描述】:

Converting Height Measurements from Imperial to Metric units 相关,但方法不同。

我有一个数据集,其中有许多混合单位的值,特别是用英制和公制单位测量高度。此外,无论出于何种原因,所述英制尺寸包含多余的引号。

我曾认为,不是执行转换,而是大规模查找替换可能会起作用,因为人们的身高相对受到限制。例如,一个 5' 3" 的人是 160.02 厘米,因此可以找到所有的一个并用另一个替换它。

考虑数据集 test.csv 中的这一行

"Female","Hispanic",25,"5' 11"""

我想将“5' 11”“”替换为“180.34”。

我尝试了sed -i 's#"5' 1"""#"180.34"#g' test.csv,但唯一的结果输出是我的终端窗口中的> 字符,这表明我做错了什么,但无法弄清楚是什么。处理多余的引号有什么我缺少的吗?

【问题讨论】:

标签: sed replace double-quotes


【解决方案1】:

在这种情况下,最简单的方法是 您的 sed-string 并转义您的

sed -i "s|\"5' 1\"\"\"|\"180.34\"|g" test.csv

【讨论】:

    【解决方案2】:

    问题在于您的 sed 表达式 5' 1 中的单引号。

    使用\x27替换单引号:

    sed -i 's#"5\x27 1"""#"180.34"#g' test.csv
    

    【讨论】:

    • 并且不要忘记为您的代码的未来读者评论此含义。
    【解决方案3】:

    另一种方式:

    sed -i 's/5'"'"' 11""/180.34/g' test.csv
    

    【讨论】:

      【解决方案4】:

      wrt Additionally, for whatever reason, said Imperial measurements contain an excess of quotation marks. - 当您以英尺和英寸编写测量值时,' 代表英尺," 代表英寸。所以 5 英尺 11 英寸写成5' 11"。在引用了 "foo" 之类的字段的 CSV 中,您需要某种方法来包含 ",而在某些 CSV 格式(例如从 Excel 中导出)中这样做的一种方法是将 " 加倍以转义它。因此,在引用字段中包含foo"bar 将是"foo""bar"。现在让我们回到5' 11" - 同样的逻辑适用并将其包含在带引号的字段中,您可以将其写为"5' 11""",其中最后一个" 之前的""" 的转义表示包含在引用的字段中。请参阅 What's the most robust way to efficiently parse CSV using awk? 以获取对适用 CSV“标准”的引用以及有关使用标准 UNIX 工具 awk 解析 CSV 的更多信息。

      wrt 您的具体问题 - 与其使用硬编码值一次转换一个数字,不如通过算法一次将它们全部转换。使用 GNU awk 进行 FPAT:

      $ cat tst.awk
      BEGIN {
          FPAT = "([^,]*)|(\"[^\"]+\")"
          OFS  = ","
      }
      {
         split($4,feetinches,/[^0-9]+/)
         ft = feetinches[2] + (feetinches[3] / 12)
         $4 = "\"" int( (10000 * ft / 3.28084) + 0.5 ) / 100 "\""
         print
      }
      
      $ cat file
      "Female","Hispanic",25,"5' 11"""
      "Male","Scottish",54,"6' 1"""
      "Female","English",12,"4' 7"""
      "TBD","Martian",935,"8' 5"""
      
      $ awk -f tst.awk file
      "Female","Hispanic",25,"180.34"
      "Male","Scottish",54,"185.42"
      "Female","English",12,"139.70"
      "TBD","Martian",935,"256.54"
      

      【讨论】:

        猜你喜欢
        • 2012-03-01
        • 1970-01-01
        • 2012-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-09
        • 2013-10-19
        • 2020-12-23
        相关资源
        最近更新 更多