Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从sed中的更改中排除字符串_Linux_Bash_Awk_Sed - Fatal编程技术网

Linux 从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' 现在我想从第一个命令中排除结果,并使用第二个命令进行更改:

我想发出一个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'
现在我想从第一个命令中排除结果,并使用第二个命令进行更改:

 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!我开始使用你的解决方案。