【问题标题】:bash apend line within group of linesbash 在一组行中追加行
【发布时间】:2020-07-30 08:07:38
【问题描述】:

为澄清而编辑 我有一个包含内容的文件

Group1
LineA
LineB
LineC


Group2
LineA
LineB
LineC


Group3
LineA
LineB
LineC

我想在一个组中插入一个特定的模板。假设我调用像insertAtGroup 2 D 这样的函数,所以最终结果应该是

Group1
LineA
LineB
LineC


Group2
LineA
LineB
LineC
LineD

Group3
LineA
LineB
LineC

我用 sed 试过了,但我无法让它工作

【问题讨论】:

  • 这是awk 的作业,RS 设置为空字符串。提供大量文档和示例。
  • 除非你总是在组尾插入,否则建议查看How to print ASCII value of a character using basic awk only
  • 根据什么插入?第 2 组中的相对行号,还是该组中特定字符串的出现?如果后者应该是完整字符串、部分字符串、完整正则表达式或部分正则表达式匹配?请[编辑]您的问题以显示更具体的示例并添加您迄今为止尝试过的代码。
  • 我猜插入会检查组和条目后缀,例如substr($1, length($1)) 但那只是我读到的。然后,如果不总是在末尾插入,那么我的想法就是处理序数和字符之间的查找/映射的函数。
  • 我想说你想做的是追加到一个组,而不是插入。您可能希望在问题的标题和文本中明确说明

标签: bash awk sed


【解决方案1】:

使用 perl 使用“段落模式”

perl -p00e 's/$/LineD\n/ if /^Group2/' file.txt

如果要就地编辑添加-i标志

perl -i -p00e 's/$/LineD\n/ if /^Group2/' file.txt

【讨论】:

    【解决方案2】:

    这通过指定 n 和 v 变量将“LineD”附加到 Group2。

      $ awk -v n=2 -v v="D" '$0=="Group"n {f=1} 
                             f&&!NF       {sub(/.$/,v,line); print line; f=0} 
                             f            {line=$0}1' file
    
    Group1
    LineA
    LineB
    LineC
    
    
    Group2
    LineA
    LineB
    LineC
    LineD
    
    
    Group3
    LineA
    LineB
    LineC
    

    假定组名是唯一的,并且与其他行不匹配。

    从组中捕获姓氏并将最后一个字符替换为给定值并插入到第一个空行。通过将给定数字附加到“组”前缀来匹配组名称。

    【讨论】:

    • 这与我最终做的非常相似,谢谢
    【解决方案3】:

    使用sed 和您的示例数据:

    sed '/Group2/,/^$/ s/^$/LineD/' inputfile
    

    【讨论】:

      猜你喜欢
      • 2017-03-18
      • 2017-03-18
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 2020-01-17
      • 2011-01-28
      相关资源
      最近更新 更多