我想在字符' ='之前从每个数字中减去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
答案 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