【问题标题】:Replacing multiple lines of text using sed使用 sed 替换多行文本
【发布时间】:2013-08-14 00:54:59
【问题描述】:

我有一个包含以下文本的文件 input.txt

Total users:

    abc
    xyz
    pqrs

用户数量可能会发生变化,但始终至少有一个用户。我想使用 sed 将用户名替换为通配符 '*'

Total users:

    *   

有没有一种方法可以让我查找“总用户数:”字符串并将之后的所有内容替换为 *.有点像

sed s/Total users: \n[Till EOF]/Toal users: \n*/g

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    一种方式:

    $ sed '3,$s/\S*$/*/' file
    Total users:
    
        *
        *
        *
    

    这会从文件的第三行到最后一行 3,$ 进行替换 s/\S*$/*/,其中替换用单个 * 替换任何非空白字符直到行尾。根据您的实际文件修改替换命令,因为如果您在用户名中允许空格,这将失败。更强大的替代品可能是:

    $ sed -r '3,$s/(\s+).*/\1*/' file
    Total users:
    
        *
        *
        *
    

    这将在初始空格之后替换为单个*。如果要将更改存储回文件,请使用 -i 选项:

    $ sed -ri '3,$s/(\s+).*/\1*/' file
    

    编辑:

    用一个*替换所有用户:

    $ sed -r '3{s/(\s+).*/\1*/;q}' file
    Total users:
    
        *
    

    虽然创建此文件比提出问题要快得多。

    【讨论】:

    • 用户数不固定,可能多于3个,也可能少于3个,所以估计不行
    • 就像我的回答解释的那样,这会从文件的第三行到最后一行进行替换。我为动态数量的用户工作。
    • 我想用一个 * 替换任意数量的用户
    • 我已经为此添加了一个解决方案,但为什么不直接使用文本编辑器呢?
    • 文件是动态生成的。我想使用自动化对其进行测试。感谢您的解决方案有效
    【解决方案2】:

    这可能是你需要的

    sed -e "/Total users:/b; s|^\([[:blank:]]*\)[^[:blank:]]\+\(.*\)|\1*\2|" input.txt
    

    【讨论】:

      【解决方案3】:

      这样就可以了:

      sed -e '/^Total users:/ s/.*/&\n\n    */; q' input.txt
      

      当它找到以Total users: 开头的行时,它会替换为自身,附加两个换行符和星号,然后退出而不处理任何其他行。

      如果您使用的是更有限的sed 版本,而您不能使用; 来分隔多个命令,您可以这样写来解决问题:

      sed -e '/^Total users:/ s/.*/&\n\n    */' -e '/^Total users:/ q' input.txt
      

      更冗长,但更便携。

      【讨论】:

        猜你喜欢
        • 2020-02-27
        • 2021-09-25
        • 1970-01-01
        • 2022-08-13
        • 2022-01-19
        • 2011-11-25
        • 2017-10-07
        • 1970-01-01
        相关资源
        最近更新 更多