在文件中搜索数字并将匹配替换为"结果-1"

时间:2017-10-17 11:55:36

标签: bash powershell

我想在字符' ='之前从每个数字中减去1。在文件列表中。例如,重命名文件中的字符串,例如" sometext.10.moretext" to" sometext.9.moretext"。

我认为这可行:

Invoke(new Action(() =>
                {
                    label1.Text = "WooHoo!!!";
                }));

但它只是添加" -1"作为我的数字之后的字符串,所以结果是" sometext.10-1.moretext"。我没有真正体验过bash(并通过windows使用它),有没有办法做到这一点? Powershell也是一种选择。

编辑

输入:some.text.10.text = some.other.text.10

所需输出:some.text.9.text = some.other.text.10

注意:实际数字可以是1到9999。

文件名具有以下格式:text@name#othername.config

4 个答案:

答案 0 :(得分:2)

您可以使用 awk 来实现此目的:

我相信您在字符串中的字词由.分隔,并且数字不会出现在=之前,否则会失败,因为我们仅使用.作为分隔符。

awk 'BEGIN{FS=OFS="."} { for(i=1; i<=NF; i++) { if($i~"=")break; if($i~/^[0-9]+$/){$i=$i-1} }}1'

输入:

sometext.10.moretext=meow.10.meow

输出:

sometext.9.moretext=meow.10.meow

答案 1 :(得分:1)

你可以尝试

echo "sometext.10.moretext=meow.10.meow" |
   sed -r 's/([^0-9]*)([0-9]*)(.*)/echo "\1$((\2-1))\3"/e'

或在TEST下更改文件(参见编辑)

sed -ri 's/([^0-9]*)([0-9]*)(.*)/echo "\1$((\2-1))\3"/e' $(find ./TEST -type f)

EDIT 遇到带有空格或换行符的文件名时,find命令会导致问题。所以你应该改变方法:

(不要使用先前失败的grep -rlz "[0-9]*" ./TEST

   find TEST -type f -print0 | xargs -0 sed -ri 's/([^0-9]*)([0-9]+)(.*)/echo "\1$((\2-1))\3"/e'

答案 2 :(得分:1)

PowerShell的

Get-ChildItem -Recurse |                       # List files
    Select-String -Pattern '[0-9]' -List |     # 'grep' files with numbers
    Foreach-Object {                           # loop over those files

        (Get-Content -LiteralPath $_.Path) |   # read their content
            ForEach-Object {                   # loop over the lines, do regex replace

                [regex]::Replace($_, '[0-9]+', {param($match) ([int]$match.Value) - 1})

        } | Set-Content -Path $_.Path -Encoding ASCII      # output the lines

    }

或简称

gci -r|sls [0-9] -lis|% {(gc -lit $_.Path)|%{
    [regex]::Replace($_,'[0-9]+',{"$args"-1})
}|sc $_.Path -enc ascii}

答案 3 :(得分:0)

echo sometext.10.moretext=meow.10.meow| awk '{sub(/10/,"9")}1'

sometext.9.moretext=meow.10.meow