2017-09-04 69 views
2

我有一個包含許多字符串的文件。例如:在具有特定條件的sed文件中替換

Bergson 
BErgson Bergso 
\a{Henri Bergson} 
Henri BERgson bergson 

我想在\a{...}封裝字Bergson(與不敏感的情況下),但只有當這個詞是不是已經命令\a{...}內。

那麼其結果必然是

\a{Bergson} 
\a{BErgson} Bergso 
\a{Henri Bergson} 
Henri \a{BERgson} \a{bergson} 

我使用sed努力,但對我來說太複雜,也許它是不正確的工具。

你有什麼想法我可以做到這一點?

回答

1

使用GNU的sed:

$ sed '/\\a{.*bergson.*}/I! s/bergson/\\a{&}/gI' 
\a{Bergson} 
\a{BErgson} Bergso 
\a{Henri Bergson} 
Henri \a{BERgson} \a{bergson} 

備選:

sed '/\\a{.*bergson.*}/In; s/bergson/\\a{&}/gI' file1 
+0

@Guuk更新中... –

+0

喬治:會好奇,你將如何應對3號線MiniMax的樣本數據 - '\ a {... Bergson} bergson \ a {Bergson}'......或者任何有'\ a {... bergson ...}'和'bergson'混合的線。它不在OP的樣本數據中,所以不知道它是否是一個現實的例子 – markp

+0

@GeorgeVasiliou謝謝。 – Guuk

1
sed -r ' 
s/(\\a\{[^}]*ber)(gson[^}]*\})/\1#\2/Ig; 
s/bergson/\\a{&}/gI; 
s/(ber)#(gson)/\1\2/gI' input.txt 

說明:

  1. s/(\\a\{[^}]*ber)(gson[^}]*\})/\1#\2/Ig; - 取代字符串,不應該觸及\a{Henri Berg#son}(在「Bergson」字中插入散列符號)。

    • [^}]*[^}]*需要用於非貪婪匹配。
  2. s/bergson/\\a{&}/gI; - 替換所有需要的 「柏格森的」 通過標準的方式。

  3. s/(ber)#(gson)/\1\2/gI - 從Berg#son中刪除#,將其恢復爲原始形式。

輸入(併發測試)

Bergson         
BErgson Bergso 
\a{Henri Bergson} bergson \a{Bergson} another words 
Henri BERgson bergson 

輸出

\a{Bergson}         
\a{BErgson} Bergso 
\a{Henri Bergson} \a{bergson} \a{Bergson} another words 
Henri \a{BERgson} \a{bergson}