我的文件如下:
elix554bx.xayybol.42> vi setup.REVISION
# Revision information
setenv RSTATE R24C01
setenv CREVISION X3
exit
我的要求是从文件中读取RSTATE,然后在setup.REVISION文件中递增RSTATE的最后2位数并覆盖到同一文件中。 你能建议怎么做吗?
答案 0 :(得分:1)
如果您使用vim
,则可以使用序列:
/RSTATE/
$<C-a>:x
第一行后面是一个返回并搜索RSTATE。第二行跳转到该行的末尾,并使用 Control-a (在上面显示为<C-a>
,并在vim
文档中)来增加该数字。像往常一样重复数字。 :x
之后还会返回并保存文件。
唯一棘手的一点是数字上的前导0使vim
认为数字是八进制的,而不是十进制的。您可以使用:set nrformats=
覆盖它,然后返回以关闭八进制和十六进制;默认值为nrformats=octal,hex
。
你可以从Drew Neil的书Practical Vim: Edit Text at the Speed of Thought中学到很多关于vim
的内容。这些信息来自第2章的提示10。
答案 1 :(得分:1)
这是一个awk
单线型解决方案:
awk '{
if ( $0 ~ 'RSTATE' ) {
match($0, "[0-9]+$" );
sub( "[0-9]+$",
sprintf( "%0"RLENGTH"d", substr($0, RSTART, RSTART+RLENGTH)+1 ),
$0 );
print; next;
} else { print };
}' setup.REVISION > tmp$$
mv tmp$$ setup.REVISION
返回:
setenv RSTATE R24C02
setenv CREVISION X3
exit
这将适当地处理从2到3到更多数字的转换。
答案 2 :(得分:0)
我为你写了一堂课。
class Reader
{
public string ReadRs(string fileWithPath)
{
string keyword = "RSTATE";
string rs = "";
if(File.Exists(fileWithPath))
{
StreamReader reader = File.OpenText(fileWithPath);
try
{
string line = "";
bool finded = false;
while (reader != null && !finded)
{
line = reader.ReadLine();
if (line.Contains(keyword))
{
finded = true;
}
}
int index = line.IndexOf(keyword);
rs = line.Substring(index + keyword.Length +1, line.Length - 1 - (index + keyword.Length));
}
catch (IOException)
{
//Error
}
finally
{
reader.Close();
}
}
return rs;
}
public int GetLastTwoDigits(string rsState)
{
int digits = -1;
try
{
int length = rsState.Length;
//Get the last two digits of the rsstate
digits = Int32.Parse(rsState.Substring(length - 2, 2));
}
catch (FormatException)
{
//Format Error
digits = -1;
}
return digits;
}
}
您可以将其用作存在
Reader reader = new Reader();
string rsstate = reader.ReadRs("C://test.txt");
int digits = reader.GetLastTwoDigits(rsstate);