1

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

Total users:

    abc
    xyz
    pqrs

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

Total users:

    *   

有没有一种方法可以让我查找“用户总数:”字符串并用 *. 就像是

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

3 回答 3

1

这可能是你需要的

sed -e "/Total users:/b; s|^\([[:blank:]]*\)[^[:blank:]]\+\(.*\)|\1*\2|" input.txt
于 2013-08-13T16:48:25.807 回答
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

哪个更冗长,但更便携。

于 2013-08-13T16:52:33.133 回答
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:

    *

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

于 2013-08-13T16:43:51.220 回答