使用sed替换多行文本

时间:2013-08-13 16:41:15

标签: bash sed

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

Total users:

    abc
    xyz
    pqrs

用户数量可能会发生变化,但始终只有一位用户。我想用sed

用外卡'*'替换用户名
Total users:

    *   

有没有办法可以找到'Total users:'字符串并用*替换之后的所有内容。有点像

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

3 个答案:

答案 0 :(得分:1)

一种方式:

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

    *
    *
    *

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

$ 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:

    *

尽管创建此文件比提出问题要快得多。

答案 1 :(得分:1)

这可能就是你需要的

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

答案 2 :(得分:1)

这样做:

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

哪个更详细,但更便携。