【问题标题】:Excluding string from changes in sed从 sed 的更改中排除字符串
【发布时间】:2016-04-08 02:40:11
【问题描述】:

我想制作一个 sed 命令来更改每个逗号分隔的部分都用双引号括起来的字符串。问题是某些值已经有双引号。

更改自:

ABZ00016,ABZ,"449,9",450,445,449,"-0,21",405,13,"182,15",0,0,0

"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吗?你对perlawk 也满意吗?
  • 如果您在 awk 中有解决方案,我将不胜感激 :-)
  • 我在下面发布了一个 gnu-awk 解决方案。

标签: linux bash awk sed


【解决方案1】:

使用gnu-awk 你可以这样做:

awk -v FPAT='"[^"]*"|[^,]*' -v OFS=, '{
   for(i=1; i<=NF; i++) {
      gsub(/^"|"$/, "", $i)
      $i = "\"" $i "\""
   }
} 1' file

输出:

"ABZ00016","ABZ","449,9","450","445","449","-0,21","405","13","182,15","0","0","0"

【讨论】:

    【解决方案2】:

    这可能对你有用(GNU sed):

    sed -r 's/^/\n/;:a;s/\n$//;s/\n("[^"]*",?)/\1\n/;s/\n([^,]*)(,?)/"\1"\2\n/;ta' file
    

    然后引入换行符作为标记:在处理完所有字段后删除标记,跳过带引号的字段并用引号包围其他字段。每次替换都将标记向前移动。

    【讨论】:

      【解决方案3】:

      将 sed 与正则表达式配合使用:

      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'
      

      【讨论】:

      • 嗨 Filip,我使用了你的命令,但我得到的是 "449","9",而不是 "449,9"
      • 这会破坏任何句号,并且仍然不能正确处理带引号的字符串。
      • 谢谢菲利普!我开始使用您的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 2017-01-20
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      • 2022-10-22
      • 1970-01-01
      相关资源
      最近更新 更多