使用Sed Mac终端查找和替换空格

时间:2013-09-17 02:04:40

标签: macos bash csv sed terminal

我有一个.CSV文件,我需要超过500,000行:

  1. 找到所有'空间双引号空间'序列并替换为空白
  2. 找到所有'空间双引号'序列并替换为空白
  3. 找到所有双引号并替换为
  4. .CSV行示例:

    "DISH Hartford & New Haven  (Hartford)", "206", "FBNHD", " 06028", " East Windsor Hill", "CT", "Hartford County"
    

    **必需输出**

    DISH Hartford & New Haven  (Hartford),206,FBNHD,06028,East Windsor Hill,CT,Hartford County
    

    我需要删除逗号前面和后面的所有双引号(")和空格(,)。

    我试过

    $ cd /Users/Leonna/Downloads/
    $ cat bs-B2Bformat.csv | sed s/ " //g
    

    这使得'命令不完整'大于提示,所以我尝试了:

    $ cat bs-B2Bformat.csv | sed s/ " //g
    sed: 1: "s/": unterminated substitute pattern
    $ cat bs-B2Bformat.csv |sed s/ \" //g
    sed: 1: "s/": unterminated substitute pattern
    $
    

    我在Excel中编辑的行太多(Excel不会加载所有行)甚至是文本编辑器。我该如何解决这个问题?

5 个答案:

答案 0 :(得分:10)

引自here

  

对于POSIX兼容性,请使用字符类[[:space:]]而不是\ s,因为后者是GNU sed扩展。

基于此,我建议如下,正如Jonathan Leffler指出的那样,它可以在GNU和BSD实现中移植。

sed -E 's/[[:space:]]?"[[:space:]]?//g' <path/to/file>

-E标志在BSD实现上启用扩展正则表达式。在GNU sed上它没有文档,但正如here所讨论的那样,它可以兼容BSD标准。

引自manual for BSD sed

  

-E将正则表达式解释为扩展(现代)常规          表达式而不是基本的正则表达式(BRE)。

将上述命令应用于包含以下单行的文件

  

“DISH Hartford&amp; New Haven(Hartford)”,“206”,“FBNHD”,“06028”,“东温莎山”,“CT”,“哈特福德郡”

它产生

  

DISH Hartford&amp; New Haven(Hartford),206,FBNHD,06028,East Windsor Hill,CT,Hartford County

答案 1 :(得分:1)

这应该这样做:

sed -i 's/\(\s\|\)"\(\|\s\)//g' bs-B2Bformat.csv

答案 2 :(得分:1)

这对我有用。这是你想要的吗?

 sed -e 's|", "|,|g' -e 's|^"||g' -e 's|"$||g' file.csv

 echo '"DISH Hartford & New Haven (Hartford)", "206", "FBNHD", " 06028", " East Windsor Hill", "CT", "Hartford County"' | sed -e 's|", "|,|g' -e 's|^"||g' -e 's|"$||g'

 DISH Hartford & New Haven (Hartford),206,FBNHD, 06028, East Windsor Hill,CT,Hartford County

答案 3 :(得分:0)

一种方法是使用及其csv模块:

import csv 
import sys 

## Open file provided as argument.
with open(sys.argv[1], 'r') as f:

    ## Create the csv reader and writer. Avoid to quote fields in output.
    reader = csv.reader(f, skipinitialspace=True)
    writer = csv.writer(sys.stdout, quoting=csv.QUOTE_NONE, escapechar='\\')

    ## Read file line by line, remove leading and trailing white spaces and
    ## print.
    for row in reader:
        row = [field.strip() for field in row]
        writer.writerow(row)

像以下一样运行:

python3 script.py csvfile

产量:

DISH Hartford & New Haven  (Hartford),206,FBNHD,06028,East Windsor Hill,CT,Hartford County

答案 4 :(得分:0)

所有目前的答案似乎都错过了:

$ cat bs-B2Bformat.csv | sed s/ " //g
sed: 1: "s/": unterminated substitute pattern
$ cat bs-B2Bformat.csv |sed s/ \" //g
sed: 1: "s/": unterminated substitute pattern
$

上面的问题是缺少单引号。应该是:

$ cat bs-B2Bformat.csv | sed 's/ " //g'
                             ^        ^

如果没有单引号,bash会在空格处拆分并发送三个单独的参数(至少对于\"的情况而言)。 sed看到它的第一个参数只是s/

编辑:仅供参考,单引号不是必需的,它们只是简化了这种情况。如果你想使用双引号,只需要转义你要保留的匹配词:

$ cat bs-B2Bformat.csv | sed "s/ \" //g"