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