String 使用sed和regexp增加文件中的数字
我想使用以下模式将文件中的所有数字增加1000:String 使用sed和regexp增加文件中的数字,string,unix,sed,find,String,Unix,Sed,Find,我想使用以下模式将文件中的所有数字增加1000: '... comment_count') VALUES ( 15132, ... '... comment_count') VALUES ( 15133, ... '... comment_count') VALUES ( 16134, ... . . 我希望更改后的输出如下: '... comment_count') VALUES ( 16132, ... '... comment_count') VALUES ( 16133, ... '.
'... comment_count') VALUES ( 15132, ...
'... comment_count') VALUES ( 15133, ...
'... comment_count') VALUES ( 16134, ...
.
.
我希望更改后的输出如下:
'... comment_count') VALUES ( 16132, ...
'... comment_count') VALUES ( 16133, ...
'... comment_count') VALUES ( 17134, ...
.
.
我尝试过这样的方法,但没有成功:
sed -r 's/`comment_count`\) VALUES \( (\d+)/echo "\1\1$((\1+1000))\"/ge' test.txt
sed
不能代替它进行数学或字符串操作
您可以使用此perl
解决方案:
perl -pe "s~(comment_count'\)\h+VALUES\h+\(\h+)(\d+)~\$1.(\$2+1000)~e" file
答案假设所有行都具有OP中所示的格式 以下
sed
脚本与sed-E-f plus1000 inputfile
一起运行(-E
将使用(
,{
等,而不是\(
,{
等)执行此任务:
# this file is named plus1000
s/([^0-9][0-9]*)([0-9])([0-9]{3})/\1\n\2\n\3/
:a
h
s/.*\n(.)\n.*/\1/
y/0123456789/1234567890/
G
/^0/{
s/0\n(.*)(.)\n.\n(.*)/\1\n\2\n0\3/
ta
}
s/(.)\n(.*)\n.\n(.*)/\2\1\3/
说明:
s/../…/
命令将第四个有效数字括在两个换行符之间\n
- 模式空间的内容将匹配
^.*\n[0-9]\n.*$
- 保留空间的内容是无关的(我们不关心内容是什么)
:标签标记do while循环开始的行
- 对填充图案和保持空间没有更改
h
命令复制模式空间的内容(当前行),覆盖其中的内容
- 模式空间不变
- 保持空间等于图案空间
s/../../
命令删除在步骤1中“突出显示”的数字周围的任何内容
- 模式空间仅包含一个数字,即其形式为
^[0-9]$
- 保持空间不变
y
命令转换其后继数字中的每个数字,9变为0的数字除外,这意味着左侧的下一个数字也应增加1
- 图案空间仅包含一个数字,与上一步相比增加了1
- 保持空间不变
G
命令将保持空间的内容附加到模式空间
- 保持空间不变
- 模式空间是刚刚在步骤5中增加的数字,后面是换行符
,后面是保持空间的内容\n
/^0/
仅将分组在{
和}
中的命令的操作限制在具有前导0
的图案空间(以前是9
)
7.1.第三个s/../../
命令删除步骤6中添加的换行符,并将其他两个换行符移到下一位(左)附近
7.2.t
命令用于测试前一次替换是否确实发生,如果发生,则将控制权转移到步骤2标记的行(实际上转移到后一行,因为:a
不执行任何操作)
s/../../
命令将重新排序片段并删除换行符
用bash数值表达式替换每一组数字。使用echo命令计算整行。Sed不知道算术,甚至不知道数字-它只知道字符串,因此在Sed中进行任何数学运算都是非常痛苦的。这应该向您展示一种使用
Perl
hi的方法,我有一个问题是超越Sed的。例如,对于.net,它有吗一个不需要循环但却需要循环的函数?regex.replace可能吗?我希望有一个函数可以像sedsed
那样一次自定义多个字符,它是图灵完成的,所以它可以完成所有其他语言可以做的。它“只是”需要不同的思维方式,在执行非基本任务时,它无疑是不可读的。但可读性仍然没有那么差。@anubhava不幸的是,这可能不是因为文件太大。我使用新ID重新生成了文件:/。无论如何,谢谢您,您在que中从未提到过任何关于大文件处理的内容stion.令人惊奇的解决方案!
# this file is named plus1000
s/([^0-9][0-9]*)([0-9])([0-9]{3})/\1\n\2\n\3/
:a
h
s/.*\n(.)\n.*/\1/
y/0123456789/1234567890/
G
/^0/{
s/0\n(.*)(.)\n.\n(.*)/\1\n\2\n0\3/
ta
}
s/(.)\n(.*)\n.\n(.*)/\2\1\3/
sed 's/[0-9]\+/$((&+1000))/g;s/.*/echo "&"/e' file