String 使用sed和regexp增加文件中的数字

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, ... '.

我想使用以下模式将文件中的所有数字增加1000:

'... 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
    不执行任何操作)

  • 如果我们到达这里,我们已经将1添加到9以外的数字,因此不需要进一步处理,因此第四个也是最后一个
    s/../../
    命令将重新排序片段并删除换行符

  • 这可能适用于您(GNU-sed):


    用bash数值表达式替换每一组数字。使用echo命令计算整行。

    Sed不知道算术,甚至不知道数字-它只知道字符串,因此在Sed中进行任何数学运算都是非常痛苦的。这应该向您展示一种使用
    Perl
    hi的方法,我有一个问题是超越Sed的。例如,对于.net,它有吗一个不需要循环但却需要循环的函数?regex.replace可能吗?我希望有一个函数可以像sed
    sed
    那样一次自定义多个字符,它是图灵完成的,所以它可以完成所有其他语言可以做的。它“只是”需要不同的思维方式,在执行非基本任务时,它无疑是不可读的。但可读性仍然没有那么差。@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