【问题标题】:sed awk replace lines with a pattern matchsed awk 用模式匹配替换行
【发布时间】:2015-05-04 17:44:41
【问题描述】:

使用 awk 或 sed 如何在模式匹配后替换每一行? 模式总是以 S:\ 和其他东西开头, 我需要从 S:\~ 到末尾的整行出现在空行之前的下一行。

我有这样的输入:

S:\dir1\subfolder1longsubf
abcdefg
1234567
permissions

S:\dir2\verylongsub
some random string
some random string

S:\dir3
some random string
some random string

S:\dir4\sub2\sub3
some random string
some random string
some random string

我需要这样的输出:

S:\dir1\subfolder1longsubf
S:\dir1\subfolder1longsubf
S:\dir1\subfolder1longsubf
S:\dir1\subfolder1longsubf

S:\dir2\verylongsub
S:\dir2\verylongsub
S:\dir2\verylongsub

S:\dir3
S:\dir3
S:\dir3

S:\dir4\sub2\sub3
S:\dir4\sub2\sub3
S:\dir4\sub2\sub3
S:\dir4\sub2\sub3

【问题讨论】:

    标签: replace awk sed


    【解决方案1】:

    我会使用awk:

    awk '/^S/ {line=$0} {print NF?line:""}' file
    

    这会存储以S 开头的行。然后,如果该行为空,则打印此存储的值或空行。

    测试

    $ awk '/^S/ {line=$0} {print NF?line:""}' file
    S:\dir1\subfolder1longsubf
    S:\dir1\subfolder1longsubf
    S:\dir1\subfolder1longsubf
    S:\dir1\subfolder1longsubf
    
    S:\dir2\verylongsub
    S:\dir2\verylongsub
    S:\dir2\verylongsub
    
    S:\dir3
    S:\dir3
    S:\dir3
    
    S:\dir4\sub2\sub3
    S:\dir4\sub2\sub3
    S:\dir4\sub2\sub3
    S:\dir4\sub2\sub3
    

    【讨论】:

      【解决方案2】:

      使用 GNU sed:

      sed  '/^S:/{h};/^[^S]/{g}' file
      

      【讨论】:

      • 这假定空白行根本不包含空格。一个更安全的解决方案是不理会empty linessed '/^\s*$/b;/^S:\\/h;//!g' file
      猜你喜欢
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 2023-02-02
      • 1970-01-01
      • 2018-08-12
      • 2014-11-02
      相关资源
      最近更新 更多