Linux 从sed中的更改中排除字符串
我想发出一个sed命令来更改字符串,使每个逗号分隔的部分都用双引号括起来。问题是有些值已经有双引号了 更改为:Linux 从sed中的更改中排除字符串,linux,bash,awk,sed,Linux,Bash,Awk,Sed,我想发出一个sed命令来更改字符串,使每个逗号分隔的部分都用双引号括起来。问题是有些值已经有双引号了 更改为: ABZ00016,ABZ,"449,9",450,445,449,"-0,21",405,13,"182,15",0,0,0 到 我准备了两个sed命令: 第一个命令排除带双引号的值 sed -e 's/"[^"]*"//g' 第二步为每个部分添加双引号 sed -e 's/\([^,]*\),/"\1",/g' 现在我想从第一个命令中排除结果,并使用第二个命令进行更改:
ABZ00016,ABZ,"449,9",450,445,449,"-0,21",405,13,"182,15",0,0,0
到
我准备了两个sed命令:
第一个命令排除带双引号的值
sed -e 's/"[^"]*"//g'
第二步为每个部分添加双引号
sed -e 's/\([^,]*\),/"\1",/g'
现在我想从第一个命令中排除结果,并使用第二个命令进行更改:
sed -e '/"[^"]*"/!s/\([^,]*\),/"\1",/g'
但它不起作用…将sed与regex mate一起使用:
sed -r -e 's/[-.a-zA-Z0-9]+/"&"/g' -e 's/""/"/g'
编辑:根据您的请求更新,按预期工作:
sed -r -e 's/"([^,]+)(,)([0-9]+)"/\1\.\3/g' -e 's/[-.a-zA-Z0-9]+/"&"/g' -e 's/""/"/g' -e 's/\./,/g'
将sed与regex mate一起使用:
sed -r -e 's/[-.a-zA-Z0-9]+/"&"/g' -e 's/""/"/g'
编辑:根据您的请求更新,按预期工作:
sed -r -e 's/"([^,]+)(,)([0-9]+)"/\1\.\3/g' -e 's/[-.a-zA-Z0-9]+/"&"/g' -e 's/""/"/g' -e 's/\./,/g'
使用
gnu awk
可以执行以下操作:
awk -v FPAT='"[^"]*"|[^,]*' -v OFS=, '{
for(i=1; i<=NF; i++) {
gsub(/^"|"$/, "", $i)
$i = "\"" $i "\""
}
} 1' file
使用
gnu awk
可以执行以下操作:
awk -v FPAT='"[^"]*"|[^,]*' -v OFS=, '{
for(i=1; i<=NF; i++) {
gsub(/^"|"$/, "", $i)
$i = "\"" $i "\""
}
} 1' file
这可能适用于您(GNU-sed):
然后引入一个换行符作为标记:在处理完所有字段后删除标记,跳过带引号的字段并用引号括住其他字段。每次替换时,将标记向前推进一行。这可能适用于您(GNU-sed):
然后引入一个换行符作为标记:在处理完所有字段后删除标记,跳过带引号的字段并用引号括住其他字段。每次替换时,将标记向前推进一行。您是否必须仅使用
sed
?您对perl
或awk
也满意吗?如果您有awk中的解决方案,我将不胜感激:-)我在下面发布了一个gnu awk解决方案。您是否只需要使用sed
?您对perl
或awk
也没问题吗?如果您在awk中有解决方案,我将不胜感激:-)我在下面发布了一个gnu awk解决方案。您好,Filip,我使用了您的命令,但我得到的是“449”,“9”,而不是“449,9”,这将破坏所有句号,并且仍然无法正确处理引用的字符串。谢谢Filip!我开始使用您的解决方案。您好,Filip,我使用了您的命令,但我得到的是“449”,“9”,而不是“449,9”。这将破坏所有句号,并且仍然无法正确处理带引号的字符串。谢谢Filip!我开始使用你的解决方案。