2017-07-28 88 views
0

我有csv文件,其中第一個([)和第二個最後一個列(])包含特殊字符。下面使用bash刪除csv文件中的特殊字符

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

給出一個例子我想從第一和]從倒數第二個欄刪除[使用bash腳本

與此sed 's/]//g' file,我可以刪除]。但是,我有與[相同的語句錯誤。

+0

我想看看我是否可以使用'sed'命令。 – cpwah

+1

ok,然後顯示你的'sed'命令。 – anubhava

+0

用這個'sed's /] // g'file',我可以刪除']'。但是,我有''語句相同的錯誤。 @anubhava – cpwah

回答

1

您的方法與sed是健全的。你只需要知道[]是正則表達式(所有類型)中的特殊字符,因此它們需要用反斜槓進行轉義。和名稱的兩個字符的選擇,[…]被使用,所以:

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

我用'sed'的方法很好,但是我對我的問題反對。混亂。 @Alfe – cpwah

+1

最初,你沒有表現出自己解決它的任何努力,沒有任何代碼。所以有人低估了。後來你用一段代碼添加了評論,但沒有改變你的問題。除非問題已更改,否則在一段時間後Downvotes不能撤銷。你應該在問題中給出'sed'方法,而不是在評論中。 – Alfe

+1

完成@Alfe – cpwah

0

您可以使用awk

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

或者sed但不會被限制在第一或第二到最後一列:

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

的關鍵是,如果你有其中的正則表達式[][]在開始[後立即關閉]它被認爲是字符類的一部分而不是正則表達式元字符。

0

試試這個:

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

然而,這可以通過使用tr能夠除去給人物做得更快

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 

這是什麼意思,在英語中,是「執行替代,以[[,包含一堆東西(並記住它們)開頭的行,以及之後的a]之後的數字(記住它)由第一堆東西和數字組成。「

-e表示「執行一些正則表達式操作」,而-i表示「用輸出的命令覆蓋輸入文件」。

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

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