2013-03-19 288 views
0

我想用sed替換某些字符,但前提是必須滿足某些條件。使用sed替換字符

所以,如果字符串中某處出現\t,應該用\替換,即。帶有反斜槓和物理選項卡。 如果出現\\t,則不應執行任何操作。

一個邏輯將代替每個\t這是不是前面\但我不知道如何編寫該正則表達式。不是很擅長這個東西,也不是很好。

回答

1

嘗試:

sed -r 's/^\\t|([^\\])\\t/\1\t/g' file 

例子:

$ cat file 
hello\tworld 
foo\\tbar 
\tfirst 
last\t 
last\\t 
\\tfirst 


$ sed -r 's/^\\t|([^\\])\\t/\1\t/g' file 
hello world 
foo\\tbar 
     first 
last 
last\\t 
\\tfirst 
+0

感謝您從其他答案複製98%:)但事實上,這個答案不適用於Mac 10.6.8 – anubhava 2013-03-19 15:39:36

0

方式一:

sed 's/[^\\]\\t/\\  /' file 

在更換零件,它是 '2個反斜槓+ Ctrl-V鍵+ Tab鍵'

+0

-1這不起作用。選項卡之前的字符丟失。例如'hello \ tworld'變成'hell \ world'。 – dogbane 2013-03-19 14:40:57

+0

你說得對。由於我之前有一些空白空間,所以沒有注意到它。 – ezamur 2013-03-19 14:47:06

-1

您可以使用此sed命令:

在Mac:

sed -E 's/(^|[^\\])\\t/\1 /g' 

或者在Linux上:

sed -r 's/(^|[^\\])\\t/\1 /g' 

如果你可以使用Perl那麼你可以使用負回顧後以及這樣的:

perl -pe 's#(?<!\\)\\t#  #g' 
+0

-1如果行以'\ t'開始,你的sed命令不起作用。 – dogbane 2013-03-19 14:41:36

+0

感謝您的評論,我已更正正則表達式來照顧這個用例。 – anubhava 2013-03-19 15:42:07