我有这个文件:
user_default:
resource: "@UserDefaultBundle/Controller/"
type: annotation
prefix: /
Other_default:
resource: "@PeopDefaultBundle/Controller/"
type: annotation
prefix: /
我想将user_default
下的前缀替换为/user
我知道如何在单行中替换,但我不知道如何检查前面的行。
答案 0 :(得分:1)
这可能适合你(GNU sed):
sed -r '/^\S/{h;b};G;/^user_default:/M{s/(prefix:\s*\S).*/\1user/};P;d' /file
这会将节标题复制到保留空间中,然后将其附加到该节中的行。如果该行同时包含user_default:
和prefix:
,则会执行所需的替换。
N.B。它使用多行开关M
来检查节标题是否以所需标签开头。
编辑: 错过了显而易见的!:
sed -r '/^user_default:/,/^\s*prefix:/{s/\(prefix:\s*).*/\1\/user/}' file
答案 1 :(得分:0)
基本上用sed并不是那么容易,但它是可行的(see this answer并根据你的需要进行修改,如果sed是唯一的选择)。我建议使用awk来完成这项工作,例如:
awk '/^user_default:/ { print ; ud=1 ; next}
/^ +resource:/ && ud==1 {print gensub("@UserDefaultBundle","/user",1) ; ud=0 ; next }
{ print }' INPUTFILE
答案 2 :(得分:0)
此AWK解决方案应该有效,相应地更改变量。
awk -v p="prefix:" -v x="user_default:" '{
{!/^[[:space:]]/ && NF=1 && a=$NF}
{if ((a==x) && ($0~p))
sub(/\//,"/user")}
}1' filename
答案 3 :(得分:0)
使用sed
sed -r '/user_default:/{:a;N;/prefix/!{/\n\S/!ba};s!(prefix:\s*).*!\1/user!}' file
如果user_default会话中不存在“prefix”,则此命令将避免将更改应用于错误的会话。