unix Linux命令,用于替换Unicode或非ASCII字符以及不在管道之前或之后的双引号

piah890a  于 8个月前  发布在  Unix
关注(0)|答案(3)|浏览(80)

我有一些CSV文件,其中有一些字符串字段由双引号包围。问题是其中一些字段只是人们引入的解释或注解,所以可能有一些非ASCII(或Unicode)字符,我的加载过程不喜欢,也可能有双引号。
我想删除所有非ASCII字符和一些双引号。文件的引号是|,所以我想删除所有不在管道之前或之后的双引号。我花了一些时间寻找一个类似的问题,但我找到的所有问题都是不同的,所以如果我问的问题已经有答案了,请原谅。
输入文件示例:

SEP-23|3958|106xxx|Anonymous Account||IE - IT|000|000000|000|DEFAULT|"TI805 ""¬PID35032 â¿""" AWS Migration""|0000

我想要这样的结果行

SEP-23|3958|106xxx|Anonymous Account||IE - IT|000|000000|000|DEFAULT|"TI805 PID35032 AWS Migration"|0000

我正在运行一个sed命令,有时候它会起作用,但是我必须运行 x 次来替换所有的双引号,在这种情况下它不起作用,不确定是因为非ASCII字符还是其他原因

sed -i 's/\([^|]\)"\([^|]\)/\1\2/g' sample.csv
7rfyedvj

7rfyedvj1#

这样的东西似乎对您的测试用例起作用。

$ sed 's/[^ -~]//g;s/|"/|<|<|</g;s/"|/>|>|>|/g;s/"//g;s/|<|<|</|"/g;s/>|>|>|/"|/g' <<\:
> SEP-23|3958|106xxx|Anonymous Account||IE - IT|000|000000|000|DEFAULT|"TI805 ""¬PID35032 â¿""" AWS Migration""|0000
:
SEP-23|3958|106xxx|Anonymous Account||IE - IT|000|000000|000|DEFAULT|"TI805 PID35032  AWS Migration"|0000

在你有一个可以工作的脚本之前,可能不要使用sed -i(通常甚至在那之后也不会使用)。你的尝试似乎甚至没有尝试做任何关于非ASCII字符等。
一个合适的解决方案是将mojibake恢复为有用的文本,或者理想情况下让原始源提供没有mojibake的数据,但通常情况下,船已经启航,你必须用你已经拥有的东西做你能做的事情。

kfgdxczn

kfgdxczn2#

使用sed

$ sed -E ':a;s/(\|"[^|]*)[[:punct:]]([^|]*"\|)| ( )/\1\2\3/;ta' <(iconv -c -t ascii input_file)
SEP-23|3958|106xxx|Anonymous Account||IE - IT|000|000000|000|DEFAULT|"TI805 PID35032 AWS Migration"|0000
gg0vcinb

gg0vcinb3#

使用GNU sed

sed -E 's/[^\x00-\x7f]//g;s/([^|])"+([^|])/\1\2/g'

(删除所有非ASCII字符和2个非|字符之间的所有双引号字符串)。
演示:

$ sed -E 's/[^\x00-\x7f]//g;s/([^|])"+([^|])/\1\2/g' <<< 'FOO|"BAR ""¬BAZâ¿"""|'
FOO|"BAR BAZ"|

相关问题