查找并用 1 替换数字并添加它

查找并用 1 替换数字并添加它

我有一个大文件,其中包含以下内容:

no = "33%"
no = "50%"

我必须增加,33 & 50所以1结果是

no = "34%"
no = "51%"

我知道这是一个很难的问题,但如果你知道如何解决它,我会很高兴听到你的意见。

答案1

也许可以使用纯正则表达式的方法(但有一些限制)来实现这一点,但这种解决方案会非常笨拙且有些丑陋。不过,这并不难awk

awk '
    {
        n=0
        if ($0 ~ /no = "[0-9]+%"/) {
                n = split($0, part, /"/)
                if (n == 3) print part[1] "\"" part[2]+1 "%\"" part[3]
        }
        if (n != 3) print
    }'

(第一条)if语句测试输入行包含字符no = ",后跟一个或多个数字,后跟%"。 (如果只想匹配行首,请^在第一个/和之间添加no。如果只想匹配行末,请在和第二个$之间添加。)然后我们在引号处将行分开。变量接收部分数;对于,计数为 3,部分为、和一个空字符串(因为第二个 之后没有任何内容)。 (请注意,引号不会出现在部分中,因为它们是分隔符。)  将计算为,因为将忽略 之后的,因此该语句将行的各部分重新组合在一起,并将数字增加一。%"/splitnno = "33%"no = 33%"part[2]+134awk%33print

如上所述,此脚本允许在数字前后添加其他内容 — 但不能包含引号。例如,

The quick brown fox             no = "33%"          What did the bird say?
jumps over the lazy dog.        no = "50%"          Quoth the raven, "Nevermore."

将转换为

The quick brown fox             no = "34%"          What did the bird say?
jumps over the lazy dog.        no = "50%"          Quoth the raven, "Nevermore."

如果一行不包含,它将不会进入块,因此它将到达底部,等于0。如果它包含,但有额外的引号,那么它no = "number%"ifnno = "number%"将要输入if块,并将n设置为等于引号字符数加一。无论哪种方式,if (n != 3) print 都将导致输入行被写出,不做任何修改。

awk是 Unix、Linux 和其他类 Unix 系统上的标准程序。(我已经用该选项测试了此脚本--posix,因此我相信它不依赖于任何 GNU 扩展。)如果您无法访问功能齐全的类 Unix 计算机,我建议您安装 Cygwin,或者简单地找到一个可以awk在您的计算机上运行的版本。

答案2

使用 Regex 是不可能的......

如果这是一次性的事情,我只会让 Excel 参与进来...首先使用 Regex 在数字周围插入分隔符(如制表符),因此,如下所示

Find: (.*?)(\d+)(.*)

Replace: \1\t\2\t\3

将其加载到 Excel 中,增加数字列,将所有内容再次保存为文本,然后查找/删除分隔符。

这是一个有点愚蠢的破解/解决方法,但如果这是一次性的事情,它会比学习使用晦涩的插件更快......

相关内容