Sed 更换每一个“;内线

Sed 更换每一个“;内线,sed,Sed,我在一个文本文件中有几行代码,如下例所示: "2009217",2015,3,"N","N","2","UPPER DARBY FIREFIGHTERS "PAC"","","","","7235 WEST CHESTER PIKE","","UPPER DARBY","PA","19082","","6106220269",4245.0100,650.0000,.0000 我想在整个文件中替换多个部分字符串中的每个双引号,类似于上面的“PAC” 因此,对于重复双引号的每个实例,结果应如下所示

我在一个文本文件中有几行代码,如下例所示:

"2009217",2015,3,"N","N","2","UPPER DARBY FIREFIGHTERS "PAC"","","","","7235 WEST CHESTER PIKE","","UPPER DARBY","PA","19082","","6106220269",4245.0100,650.0000,.0000
我想在整个文件中替换多个部分字符串中的每个双引号,类似于上面的“PAC”

因此,对于重复双引号的每个实例,结果应如下所示:

"2009217",2015,3,"N","N","2","UPPER DARBY FIREFIGHTERS PAC","","","","7235 WEST CHESTER PIKE","","UPPER DARBY","PA","19082","","6106220269",4245.0100,650.0000,.0000
我来到这里:

cat file.txt | sed "s/\([^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,\)\([^,]*\),\(.*\)/\1\2\3/"
但是现在我不知道如何替换
\2
中的双引号


如果使用
sed
,这可能吗?

我个人会使用
awk
,因为它更具可读性:

#!/usr/bin/env awk
BEGIN {
    # Use ',' as the input and output field delimiter
    FS=OFS=","
}
{
    # Iterate through all fields. (NF is the number of fields.)
    for(i=1;i<=NF;i++) {
        # If the field starts and ends with a '"'
        if($i ~ /^".*"$/) {
            # Replace all '""
            gsub(/"/,"",$i)
            # Wrap in '"' again
            $i = "\"" $i "\""
        }
    }
}
print
#/usr/bin/env awk
开始{
#使用“,”作为输入和输出字段分隔符
FS=OFS=“,”
}
{
#遍历所有字段。(NF是字段数。)

对于(i=1;i我个人会使用
awk
,因为它更具可读性:

#!/usr/bin/env awk
BEGIN {
    # Use ',' as the input and output field delimiter
    FS=OFS=","
}
{
    # Iterate through all fields. (NF is the number of fields.)
    for(i=1;i<=NF;i++) {
        # If the field starts and ends with a '"'
        if($i ~ /^".*"$/) {
            # Replace all '""
            gsub(/"/,"",$i)
            # Wrap in '"' again
            $i = "\"" $i "\""
        }
    }
}
print
!/usr/bin/env-awk
开始{
#使用“,”作为输入和输出字段分隔符
FS=OFS=“,”
}
{
#遍历所有字段。(NF是字段数。)
对于(i=1;i这可能适用于您(GNU-sed):

这将从由双引号包围并由
分隔的字符串中删除额外的双引号

它通过消除正确构造的双引号字符串和非引号字符串(在本例中为数字)来实现这一点,然后删除不后跟

[^",]*,                            # non double quoted strings
"[^",]*",                          # properly quoted strings
(([^",]*,)*("[^",]*",([^",]*,)*)*) # eliminate all properly constructed strings
"[^",]*"([^,])                     # improper double quotes
       ^
       |
这可能适用于您(GNU-sed):

这将从由双引号包围并由
分隔的字符串中删除额外的双引号

它通过消除正确构造的双引号字符串和非引号字符串(在本例中为数字)来实现这一点,然后删除不后跟

[^",]*,                            # non double quoted strings
"[^",]*",                          # properly quoted strings
(([^",]*,)*("[^",]*",([^",]*,)*)*) # eliminate all properly constructed strings
"[^",]*"([^,])                     # improper double quotes
       ^
       |


在它前面加一个反斜杠?@MadPhysicast是的,这是正确的。您在替换中忘记了
\1
\3
。此外,您可以执行
sed…file
,而不是执行
cat file…
。稍后,使用
-i
标记进行就地转换会更容易。有许多CSV拨号程序但是大多数都是用双引号来引用(原文如此)。反斜杠在这些方言中根本不是转义字符。在它前面加一个反斜杠?@madpysicast是的,没错。你在替换字符时忘记了
\1
\3
。此外,你可以做
sed…file
,而不是做
cat file | sed…
。以后它会使
-i
更容易使用滞后于就地进行转换。有许多CSV方言,但大多数都使用双引号来引用它们(原文如此)。反斜杠在这些方言中根本不是转义字符。你已经搞定了。你的正则表达式再简单不过了。你应该怎么做
return?@potong抓得好!我移除了sedversion@thewhtmba我删除了sed版本,potong发现了一个问题。@hek2mgl谢谢,我已经实现了
awk
答案。你已经搞定了。你的正则表达式再简单不过了。你应该怎么做
return?@potong抓得好!我移除了sedversion@thewhtmba我删除了sed版本,Poton发现了一个问题。@hek2mgl谢谢,我已经实现了
awk
答案。