我正在尝试在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
除了之外,它还可以删除最后一行。我怀疑这与我使用模式缓冲区有关,但我似乎无法找到解决方案。
非常感谢帮助!
答案 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