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
答案。