sed与下一行不匹配

时间:2019-10-07 20:34:37

标签: regex linux sed

我有一个名为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行。

1 个答案:

答案 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 works/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