首页 > 解决方案 > 将 pattern1 行存储在缓冲区中并使用它来替换 pattern2

问题描述

文件:

url: urlvalue
name: 
organisation:
word

我如何提取 urlvalue 并将其添加到 name: 以便最终输出。

url: urlvalue
name: urlvalue
organisation:
word

正则表达式来查找模式并进行复制,但通过编辑模式的第一个单词,例如。在上面找到带有 ^url 的行,在该行下方添加同一行的副本,但将 url: 更改为 name:

还查询以下内容:如何在 awk 或 sed 中否定多个正则表达式?

例如。所有不以 name、organization 和 url 开头的行 --->apped pass: 作为这些行的前缀

试过:

awk '$1 != "url*" && $1 != "name*" && $1 != "organisation*" {$1 = "pass"} {print}'

也试过:

awk '$1 != "url*" && $1 != "name*" && $1 != "organisation*" {gsub(/^/, pass:, "g", $1) {print}'

不工作

另一个尝试过的解决方案部分工作

awk '$1 != "url:" && $1 != "name:" && $1 != "organisation:" {print "pass"$0}'

但它只输出

pass:word

期望的输出:

url: urlvalue
name: urlvalue
organisation:
pass:word

标签: sed

解决方案


假设name:可以忽略任何url:url:name:

$ sed -n '/^name:/!p; s/^url:/name:/p' file
url: urlvalue
name: urlvalue
organisation:

-n禁用自动打印。print 任何不以“name:”开头的行。然后将p标志与s///命令一起使用,打印以“url:”开头的行,并将其更改为以“name:”开头。

相同的想法awk

$ awk '!/^name:/; sub(/^url:/, "name:")' file
url: urlvalue
name: urlvalue
organisation:

推荐阅读