【问题标题】:store a pattern1 line in buffer and use it to replace the pattern2将 pattern1 行存储在缓冲区中并使用它来替换 pattern2
【发布时间】:2021-12-20 11:45:24
【问题描述】:

文件:

url: urlvalue
name: 
organisation:
word

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

url: urlvalue
name: urlvalue
organisation:
word

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

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

例如。所有不以名称、组织和 url 开头的行 ---> 应用 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 's/^url: \(.*\)$/: \1/; /^name: *$/d' a.txt - 添加新行 name: \1 并删除 name:

标签: sed


【解决方案1】:

假设可以忽略以name: 开头的任何现有行,并且您只想复制每个url: 行并将url: 更改为name:,以下可能是合适的:

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

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

awk的想法相同:

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

【讨论】:

    【解决方案2】:

    终于成功了

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

    【讨论】:

      猜你喜欢
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 2013-07-26
      相关资源
      最近更新 更多