替换不在括号中的数字?
Posted
技术标签:
【中文标题】替换不在括号中的数字?【英文标题】: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 是否可行? 提前感谢您的帮助。
【问题讨论】:
【参考方案1】:将 GNU awk 用于多字符 RS:
$ cat file
9(9)S99
D9(999)L9(9)
G999N9(9)
99C99
$ gawk -v RS='[()]' 'ORS=RT NR%2gsub(/[[: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/(?<=\()9(?=9)|(?<=9)9(?=\))|(?<!\()9(?!\))/X/g' file
怎么样?
@AvinashRaj 它正在改变所有数字,我也注意到如果你得到 (9)+,我的意思是 (999) 或 (9999) 它只会留下第一个和最后一个数字,并且会改变休息.
这就是我所说的:(99999999) -> (XXXXXXXX) 它应该离开 9。
@AvinashRaj - Flap 是 OP,不幸的是,他在 cmets 中澄清了他的要求,而不是编辑他的问题。
@EdMorton 看不到谁是 OP :-)以上是关于替换不在括号中的数字?的主要内容,如果未能解决你的问题,请参考以下文章