我有一个包含以下文本的文件 input.txt
Total users:
abc
xyz
pqrs
用户数量可能会发生变化,但始终至少有一个用户。我想使用 sed 将用户名替换为通配符 '*'
Total users:
*
有没有一种方法可以让我查找“用户总数:”字符串并用 *. 就像是
sed s/Total users: \n[Till EOF]/Toal users: \n*/g
这可能是你需要的
sed -e "/Total users:/b; s|^\([[:blank:]]*\)[^[:blank:]]\+\(.*\)|\1*\2|" input.txt
这将做到:
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
哪个更冗长,但更便携。
单程:
$ 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:
*
尽管创建此文件比提出问题要快得多。