似乎无法获得正确的sed命令正则表达式

时间:2015-11-28 23:14:59

标签: regex csv unix awk sed

我有一个CSV文件,我需要替换双引号的后跟,后跟换行符,字符串为“XXXX”

我尝试了以下内容:

LC_CTYPE=C && LANG=C && sed 's/\"\n/XXXX/g' < input_file.csv > output_file.csv

LC_CTYPE=C && LANG=C && sed 's/\"\n\r/XXXX/g' < input_file.csv > output_file.csv

也尝试了

sed 's/\"\n\r/XXXX/g' < input_file.csv > output_file.csv

在每种情况下,该命令似乎都无法识别文件中的“\ n”的特定组合

如果我只查找双引号,它会起作用:

sed 's/\"/XXXX/g' < input_file.csv > output_file.csv

如果我只查找换行符:

sed 's/\n\r/XXXX/g' < input_file.csv > output_file.csv

但是对于组合的正则表达式字符串

的find-replace没有运气

任何指导都将非常感谢。

添加简化的样本数据

示例输入数据(标题行和两个示例记录):

column1,column2
data,data<cr>
data,data"<cr>

示例输出:

column1,column2
data,data<cr>
data,dataXXXX

更新:运行使用bash(MacOS)中的perl命令可以完成这项任务:

perl -pe 's/\"/XXXX/' input.csv > output1.csv

然后

perl -pe 's/\n/YYYY/' output1.csv > output2.csv

这导致每条记录末尾的XXXXYYYY

我确信有一种更简单的方法,但这似乎是在我一直在使用的测试文件上做的伎俩。在我使用原始200K行csv文件之前尝试一下。

2 个答案:

答案 0 :(得分:3)

sed用于单独行的简单替换,即所有,因此这不是sed的工作。

听起来这就是你想要的(使用GNU awk进行多字符RS):

>db.documents.find({"types.$id":"3eaabf5"})
>
>db.documents.find({"types.name":"PDF"})
>

上面的最终$ awk -v RS='"\n' -v ORS='XXXX' '1' file column1,column2 data,data data,dataXXXX$ 是我的提示,证明$和后续换行都已被替换。

答案 1 :(得分:1)

您可以尝试这样的事情:

sed ':a;/"\r\?$/{N;s/"\r\?\n\|"\r\?$/XXXX/;ba;}'

细节:

:a                  # define the label "a"
/"\r\?$/            # condition: if the line ends with " then:
{
    N               # add the next line to the pattern space
    s/              # replace:
         "\r\?\n    # the " and the LF (or CRLF) 
      \|
         "\r\?$     # or a " at the end of the added line
                    # (this second alternative is only tested at the end
                    #  of the file)
     /XXXX/         # with XXXX
    ba              # go to label a
}