【问题标题】:Replace numbers not in parentheses?替换不在括号中的数字?
【发布时间】:2014-09-12 08:45:16
【问题描述】:

我有一个包含一些数字和字母的文件,例如:

输入:

9(9)S99
D9(9)L9(9)
G999N9(9)
99C99

我需要用 X 替换所有数字(在本例中为 9),除了括号内的数字,例如:

输出:

X(9)SXX
DX(9)LX(9)
GXXXNX(9)
XXCXX

在 bash 中使用 sed、grep 或 awk 是否可行?
提前感谢您的帮助。

【问题讨论】:

    标签: bash replace awk sed grep


    【解决方案1】:

    将 GNU awk 用于多字符 RS:

    $ cat file                                                         
    9(9)S99
    D9(999)L9(9)
    G999N9(9)
    99C99
    
    $ gawk -v RS='[()]' '{ORS=RT} NR%2{gsub(/[[:digit:]]/,"X")} 1' file
    X(9)SXX
    DX(999)LX(9)
    GXXXNX(9)
    XXCXX
    

    上面假设你的括号总是成对的,例如你不能有(( ... )

    【讨论】:

    • 效果很好,即使括号内有4个以上的数字也不会改变,非常感谢。
    【解决方案2】:

    通过 perl,

    $ perl -pe 's/(?<!\()9/X/g' file
    X(9)SXX
    DX(9)LX(9)
    GXXXNX(9)
    XXCXX
    

    【讨论】:

    • @lihao 这个perl -pe 's/(?&lt;=\()9(?=9)|(?&lt;=9)9(?=\))|(?&lt;!\()9(?!\))/X/g' file怎么样?
    • @AvinashRaj 它正在改变所有数字,我也注意到如果你得到 (9)+,我的意思是 (999) 或 (9999) 它只会留下第一个和最后一个数字,并且会改变休息.
    • 这就是我所说的:(99999999) -> (XXXXXXXX) 它应该离开 9。
    • @AvinashRaj - Flap 是 OP,不幸的是,他在 cmets 中澄清了他的要求,而不是编辑他的问题。
    • @EdMorton 看不到谁是 OP :-)
    猜你喜欢
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多