sed:替换多行

时间:2017-07-17 14:37:53

标签: regex unity3d sed zsh

我正在尝试在OSX(zsh)上使用 sed 进行多行替换。 我的输入文件(Unity Asset文件)如下所示:

...
displaySetting: 0
 applicationIdentifier:
  Android: com.appid.name
  Standalone: com.appid.name
  Tizen: com.appid.name
  iOS: com.appid.name
  tvOS: com.appid.name
buildNumber:
 iOS: 190
someOtherID: 190
moreIDsOverHere: 978987
...

我想替换

buildNumber:
 iOS: 190

buildNumber:
 iOS: myBuildNumber

使用以下命令:

sed "N;s/^\\(.*buildNumber:.*.*$^.*iOS: \\)[0-9]*.*$/\\1myBuildNumber/;P;D" file.asset

除了之外,它还可以删除最后一行。我怀疑这与我使用模式缓冲区有关,但我似乎无法找到解决方案。

非常感谢帮助!

2 个答案:

答案 0 :(得分:2)

最好将awk用于多行记录编辑:

awk '/buildNumber:/{p=NR} NR==p+1 && /iOS: [0-9]+/{sub(/iOS.*/, "iOS: myBuildNumber")} 1' file

dsplaySetting: 0
 applicationIdentifier:
  Android: com.appid.name
  Standalone: com.appid.name
  Tizen: com.appid.name
  iOS: com.appid.name
  tvOS: com.appid.name
buildNumber:
  iOS: myBuildNumber
someOtherID: 190
moreIDsOverHere: 978987

答案 1 :(得分:2)

您无需在此处使用保留空间。试试这个:

sed "/^[[:space:]]*buildNumber/{n;s/\(iOS: \)[0-9]*/\1myBuildNumber/;}" file

找到buildNumber后,n会读取下一行并搜索iOS:后跟数字。如果找到,则模式将替换为iOS(使用反向引用),后跟myBuildNumber

修改

要在OSX下编辑到位文件,请添加-i标记:

sed -i '' "/^[[:space:]]*buildNumber/{n;s/\(iOS: \)[0-9]*/\1myBuildNumber/;}" file