查找替换为带有过多引号的 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"
与 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 -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"""
其中最后一个 "
之前的 ""
是用于包含在引用字段中的 "
的转义表示。请参阅
关于您的具体问题 - 与其使用硬编码值一次转换一个数字,不如通过算法一次转换所有数字。将 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"