用具有特定条件的sed替换文件

时间:2017-09-04 22:15:40

标签: bash sed replace

我有一个包含很多字符串的文件。例如:

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

我想在Bergson中封装单词\a{...}(带有不敏感的大小写),但前提是该单词不在\a{...}命令中。

所以结果必须是

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

我正在尝试使用sed,但这对我来说太复杂了,或者它可能不是正确的工具。

你知道我怎么能这样做吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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; - 以标准方式替换所有需要的“bergsons”。

  3. s/(ber)#(gson)/\1\2/gI - 从#中移除Berg#son,将其还原为原始格式。

  4. 输入(测试很复杂)

    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}