我有一个大文件,其中包含以下内容:
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,部分为、和一个空字符串(因为第二个 之后没有任何内容)。 (请注意,引号不会出现在部分中,因为它们是分隔符。) 将计算为,因为将忽略 之后的,因此该语句将行的各部分重新组合在一起,并将数字增加一。%"
/
split
n
no = "33%"
no =
33%
"
part[2]+1
34
awk
%
33
print
如上所述,此脚本允许在数字前后添加其他内容 — 但不能包含引号。例如,
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%"
if
n
no = "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 中,增加数字列,将所有内容再次保存为文本,然后查找/删除分隔符。
这是一个有点愚蠢的破解/解决方法,但如果这是一次性的事情,它会比学习使用晦涩的插件更快......