查找替换为带有过多引号的 sed

Find replace with sed with an excess of quotation marks

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

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

我原以为,与其进行转换,不如批量查找替换可能会奏效,因为人们的身高相对受限。例如,身高 5' 3" 的人是 160.02cm,因此可以只找到一个并用另一个替换它。

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

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

我想用“180.34”替换“5'11”“”。

我试过 sed -i 's#"5' 1"""#"180.34"#g' test.csv 但唯一的结果输出是我的终端 window 中的一个 > 字符,这表明我做错了什么,但不能完全弄清楚是什么。我是否缺少处理多余引号的内容?

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

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

问题是您的 sed 表达式中的单引号 5' 1

\x27代替单引号:

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

另一种方式:

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

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""" 其中最后一个 " 之前的 "" 是用于包含在引用字段中的 " 的转义表示。请参阅 以了解适用的 CSV "standards" 以及有关使用标准 UNIX 工具 awk 解析 CSV 的更多信息。

关于您的具体问题 - 与其使用硬编码值一次转换一个数字,不如通过算法一次转换所有数字。将 GNU awk 用于 FPAT:

$ cat tst.awk
BEGIN {
    FPAT = "([^,]*)|(\"[^\"]+\")"
    OFS  = ","
}
{
   split(,feetinches,/[^0-9]+/)
   ft = feetinches[2] + (feetinches[3] / 12)
    = "\"" 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"