我有一个名为VERSIONSFILE的文件:
[GUI]
Version="3.02.104"
[NOTGUI]
Version="1.05.24"
[ALSONOTGUI]
Version="3.01.230"
我希望通过Windows .bat文件替换版本号。目前,我正在使用GNU sed替换文件。我正在运行的sed命令如下:
sed -r -i.bak -e“ s / [GUI] [\ r \ n] Version。* $ / [GUI] \ nVersion = \” 3.02.108 \“ / gm”“ VERSIONSFILE”“ VERSIONSFILE “
据我所知,它应该匹配并输出新版本号为3.02.108。我在下面检查了我的正则表达式,它也正确输出了我的预期结果。
https://regex101.com/r/GaSxKY/6
[GUI]的第一部分找到[GUI]字符串。
[\ r \ n]匹配任何换行符,在这种情况下,我期望的是\ n,但认为添加两者不会造成伤害。
版本。* $在整个版本行上匹配,以确保它选择了所有内容。
我也尝试过使用powershell replace,并且遇到了完全相同的问题,似乎无法在下一行找到它。两种方法我都可以一次替换1行,但一次不能替换2行。
答案 0 :(得分:2)
默认情况下,sed
每行工作。有a special construct允许将整个文件“提取”为单个字符串,类似于powershell中的Get-Content -Raw
,但是在这里使用sed
特殊语言是有意义的。
使用
sed -r -i.bak '/^\[GUI]$/{N;s/\nVersion.*/\nVersion="3.02.108"/}' file
# Or
sed -r -i.bak '/^\[GUI]$/{n;s/Version.*/Version="3.02.108"/}' file
在这里
/^\[GUI]$/
-查找等于[GUI]
然后
N;
-读取下一行,将\n
和该行追加到模式空间s/\nVersion.*/\nVersion="3.02.108"/
-用换行符和N
代替换行符(由Version
命令添加)和以Version="3.02.108"
开头的下一行和n;
或者,
\n
-打印当前模式空间,清空当前模式空间,并读取输入的下一行(因此,与上面的区别是从字符串the中删除了第一行“ context”行)替换命令将继续有效,并且在所有sed
版本中都不需要匹配does not work的s/Version.*/Version="3.02.108"/
Version
-替换以Version="3.02.108"
开头的子字符串,并以<ListView.ItemTemplate>
<DataTemplate>
<ViewCell Tapped="OnDetailsButtonClicked">
<Frame
Margin="2,2,2,2"
Padding="5"
BackgroundColor="White"
IsClippedToBounds="True">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20*" />
<ColumnDefinition Width="60*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ffimageloading:CachedImage
x:Name="profilePhoto"
Grid.Row="0"
Grid.Column="0"
Aspect="AspectFit"
HeightRequest="50"
HorizontalOptions="Center"
Source="{Binding CoworkerProfilePhoto}"
VerticalOptions="Center"
WidthRequest="50">
<ffimageloading:CachedImage.Transformations>
<fftransformations:CircleTransformation />
</ffimageloading:CachedImage.Transformations>
</ffimageloading:CachedImage>
....
文本结尾直到字符串结尾。请参见online demo