删除 csv 文件中整数周围的引号

Bal*_*eth 4 command-line scripts sed text-processing

在一个大(> 1 GB)的csv文件中,我有类似的东西

"34432", "name", "0", "very long description"
Run Code Online (Sandbox Code Playgroud)

但与其说是我想要

34432, "name", 0, "very long description".
Run Code Online (Sandbox Code Playgroud)

我正在查看,sed但这项任务超出了我的范围。

任何建议如何实现这一目标?

Syl*_*eau 7

使用 perl:

perl -ne 's/"(\d+)"/$1/g; print' file.csv > new_file.txt
Run Code Online (Sandbox Code Playgroud)

所有的工作都由s/"(\d+)"/$1/g哪里完成

  • s/patternA/patternB/用于替换patternApatternB
  • 然后 perl 查找一个或多个\d+由双引号括起来的数字。
  • ( \d+)周围的括号用于捕获数字并将它们重用作为具有 perl 特殊变量的替换模式$1


ste*_*ver 6

应该适用于这种情况的 GNU sed 正则表达式是

sed -r 's/"([0-9]+)"/\1/g'    
Run Code Online (Sandbox Code Playgroud)

对于纯 sed,您需要转义分组括号和+修饰符

sed 's/"\([0-9]\+\)"/\1/g'
Run Code Online (Sandbox Code Playgroud)

您可以使用某些版本的 sed 执行就地替换,例如

sed -ri 's/"([0-9]+)"/\1/g' file.csv
Run Code Online (Sandbox Code Playgroud)

您还可以使用 POSIX 类[[:digit:]]代替字符范围[0-9]


ter*_*don 5

你对问题的描述不是很具体。我假设您只想删除第一个和第三个字段周围的双引号。如果是这样,其中任何一个都应该有效:

  1. sed

    sed -r 's/^"([^"]+)"(\s*,\s*[^,]+)\s*,\s*"([^"]+)"/\1\2, \3/' file.csv
    
    Run Code Online (Sandbox Code Playgroud)

    解释

    -r启用扩展正则表达式,允许我们使用括号来捕捉模式,而无需逃避它们。因此,我们匹配行首的引号 ( ^"),然后是一个或多个非引号字符 ( [^"]+),然后是结束引号,接着是 0 个或多个空格、一个逗号,然后又是 0 个或多个空格 ( \s*,\s*) ,然后是一段非逗号,直到下一个逗号(这定义了第二个字段)。最后,我们查找 0 个或多个空格、一个逗号,并将其替换为第一个捕获的模式 ( \1),然后是第二个 ( \2)、一个逗号、一个空格和第三个。

  2. 珀尔

    perl -pe 's/^"([^"]+)"(\s*,\s*[^,]+)\s*,\s*"([^"]+)"/$1$2, $3/; ' file.csv
    
    Run Code Online (Sandbox Code Playgroud)

    解释

    -p意味着在应用通过的脚本后打印每一行-e。脚本本身与sed上面的正则表达式基本相同。只有在这里,捕获的模式是$1

  3. awk

    awk -F, -v OFS="," '{gsub("\"","",$1)0gsub("\"","",$3);}1;' file.csv 
    
    Run Code Online (Sandbox Code Playgroud)

    解释

    -F设置字段分隔符,OFS是输出字段分隔符,它也被设置为,正确打印行。由于我们在第一个 ( ) 和第三个字段 ( )上运行它gsub,因此进行替换,将所有"内容替换为空,它只会从这些字段中删除引号。这只是“打印行”的简写。$1$31;awk