我有csv文件,其中第一个([)和第二个最后一列(])包含特殊字符。下面给出一个例子
col1 col2 col3 ..... coln-1 coln
[number number number ..... number] number
我想使用bash脚本从第一列和[
中删除]
使用此sed 's/]//g' file
,我可以删除]
。但是我对[
的错误有相同的说法。
答案 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