我正在处理这个 SE 数据查询.csv
的输出,看起来像这样(只有 5022 个条目):
"{
""id"": 281952,
""title"": ""Flash 11.2 No Longer Supported by Google Play""
}"
"{
""id"": 281993,
""title"": ""Netbeans won't open in Ubuntu""
}"
(并且它^M
在 [number] 和 ""title"" 之间有行尾)。我需要它看起来像这样:
281952,Flash 11.2 No Longer Supported by Google Play
281993,Netbeans won't open in Ubuntu
我在某个文本编辑器中修复了这个问题,该编辑器很容易保持无名,但我想制作一个脚本,这样我就不必在每次刷新查询时都重复一遍,这样其他人就可以使用它。我用sed
...
这一系列命令完美运行(尽管它可能效率低下;它只是一个试错解决方案):
# Print the ^M and remove them, write to a new file:
cat -v QueryR* | sed 's/\^M//' > QueryNew
# remove all the other junk:
sed -i 's/{//' QueryNew
sed -i 's/}//' QueryNew
sed -i 's/""//g' QueryNew
sed -i 's/^"//' QueryNew
sed -i '/,/{N;/\n.*title:\s/{s/,\n.*title:\s/,\ /}}' QueryNew
sed -i 's/^\s\+//' QueryNew
sed -i '/^\s*$/d' QueryNew
sed -i 's/^id:\ //' QueryNew
sed -i 's/,\ /,/' QueryNew
sed -i 's/\\//g' QueryNew
那么,为什么不呢?只有^M
and{}
被删除,其他的都还在。
#!/bin/bash
cat -v QueryR* | sed 's/\^M//' > QueryNew
sed -i '{
s/{//
s/}//
s/""//g
s/^"//
/,/{N;/\n.*title:\s/{s/,\n.*title:\s/,\ /}}
s/^\s\+//
/^\s*$/d
s/^id:\ //
s/,\ /,/
s/\\//g
}' QueryNew
我敢肯定我的错误很明显......
使用
cat -v
将 CR 字符转换为文字^M
序列对我来说从根本上来说很难看 - 如果您需要删除 DOS 行尾,请使用dos2unix
,tr
或sed 's/\r$//
'如果您坚持使用 sed,那么我建议您打印您想要的位,而不是尝试删除您不需要的所有随机位 - 例如
您可以通过在值序列的每一端匹配零个或多个引号来获得幻想并将引号删除滚动到键值提取中
您可以通过首先在结尾处加入成对的行然后以非贪婪方式匹配键值对乘法 ( ) 来获得真正的幻想和模拟
paste
sed
,\r$
g
(我个人更喜欢 KISS 方法并使用第一种方法)。
FWIW,由于您的输入似乎被过度引用 JSON,我建议安装适当的 JSON 解析器,例如
jq
然后你可以做类似的事情
它删除了多余的引号,然后用于
jq
提取感兴趣的字段 - 请注意,它jq
似乎可以处理 DOS 样式的行尾,因此无需采取特殊步骤来删除它们。更改为
jq '.[]'
转储所有属性值对。归功于使用 grep -o 克服换行符 的灵感和基本
jq
语法由于steeldriver和进一步的修补,我修复了它。未精制但有效。
翻译:
s/"{//
删除"{
s/}"//
删除}"
s/^"//
删除"
从一行和下一行的行/,\r/{N;/\n.*title.*:\s/{s/,\r\n.*title.*:\s/,\ /}}
匹配开始,将所有内容替换为删除所有剩余的双双引号从行首删除空格删除空行删除它后面的空格删除反斜杠(转义字符用于" 添加到某些标题字段)在运行脚本时指定一个输出文件,例如,\r
[whatever]title[whatever]:
,
s/""//g
s/^\s\+//
/^\s*$/d
s/^id:\ //
id:
s/\\//g
tee "$1"
./queryclean newquery.csv
这并不是完全回答您的问题或解决您的问题,而是要摆脱不需要的字符,您可以使用tr:
你会得到:
虽然问题要求
sed
,但可以解决 sed 在 Python 中的问题:此代码与 python2 和 python3 兼容,因此任何一个都可以工作
样品运行:
另外三种方法:
awk
Perl
具有 perl 兼容正则表达式和简单 perl 的 GNU grep:
这是另一个用 Ruby 编写的脚本。它将保留标题中的逗号,可以轻松地将其导入任何电子表格程序而不会破坏列。
程序运行后,生成的输出将如下所示