使用bash从csv文件中删除特殊字符

时间:2017-07-28 14:25:58

标签: bash

我有csv文件,其中第一个([)和第二个最后一列(])包含特殊字符。下面给出一个例子

col1      col2      col3      ..... coln-1   coln  
[number   number    number    ..... number]  number

我想使用bash脚本从第一列和[中删除]

使用此sed 's/]//g' file,我可以删除]。但是我对[的错误有相同的说法。

4 个答案:

答案 0 :(得分:1)

您使用sed的方法是合理的。您只需要知道[]是(所有类型的)正则表达式中的特殊字符,因此它们需要使用反斜杠进行转义。并且为了选择两个字符,使用[…],所以:

sed 's/[\[\]]//g' test.csv

但是,使用可以删除给定字符的tr可以更快地完成此操作:

tr -d '[]' < test.csv > test2.csv

答案 1 :(得分:1)

试试这个:

sed -i -e 's/^\[\(.*\)\] \(-?[0-9\.]*\)$/\1 \2/g' $file
            ^ ^^ ^^    ^  ^   ^        ^  ^  ^ 
            | || ||    |  |   |        |  |  + -the second match (the number)  
            | || ||    |  |   |        | +---- the first match (the n-1 first fields)      
            | || ||    |  |   |        +------ end of line
            | || ||    |  |   +--------------- a number
            | || ||    |  +------------------- save in memory (\2)
            | || ||    +---------------------- your closing bracket
            | || |+-------------------------- the n-1 first fields
            | || +--------------------------- save in memory (\1)
            | |+----------------------------- your opening bracket
            | +------------------------------ beginning of line    
            +-------------------------------- substitution mode

在英语中,它的含义是“执行替换,替换以[开头包含一堆东西(并记住它们)的行,在此之后有一个],之后有一个数字(记住它)第一堆东西和数字。“

-e表示“执行一些正则表达式操作”,-i表示“用命令输出覆盖输入文件”。

答案 2 :(得分:0)

您可以使用awk

awk  '{gsub(/[][]/,"",$1); gsub(/[][]/,"",$(NF-1))} 1' file

sed但不限于第一列或倒数第二列:

sed -e 's/[][]//g' file

关键是正则表达式[][],如果在开始]之后立即关闭[,则将其视为字符类的一部分,而不是正则表达式元字符。

答案 3 :(得分:0)

awk '{gsub(/[\[\]]/,"")}1' file

col1      col2      col3      ..... coln-1   coln  
number   number    number    ..... number  number