Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何通过匹配前一行用sed替换文本_Linux_Sed_Awk - Fatal编程技术网

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