我知道有很多关于它的问题,但我无法让它发挥作用。
我想用或清理一个组(例如root
)。所以我需要删除之后的所有内容/etc/group
sed
awk
root:*:0:
我尝试用以下方法删除它:
cat /etc/group | awk '!p;/^root:*:0:/{p=1}'
和
cat /etc/group | sed 's/root\:\*\:0\:.*//'
但sed
删除整root
行。
我究竟做错了什么?
答案1
您可以将地址与 sed 一起使用来限制要操作的行:
sed '/^root:/s/:[^:]*$/:/' /etc/group
对于以 开头的行root:
,将删除该行最后一个字符之后的所有字符:
。
(/etc/group
记录只有 4 个:
分隔列,因此它会删除最后一列以及其中的所有组成员)
答案2
和awk
:
awk 'BEGIN{OFS=FS=":"} $1=="root"{$NF=""} 1' /etc/group
拆分字段,:
如果第一个字段是 ,则将最后一个字段设置为空字符串root
。
答案3
除了这个问题是否真的应该使用简单的文本处理工具来完成之外,您的sed
调用会清除整行,因为“替换”命令替换了整个找到带有替换的模式(在您的情况下为空字符串)。
让你的线路正常工作的最小修改sed
是写
sed 's/root:\*:0:.*/root:*:0:/' /etc/group
或者,使用捕获组,
sed 's/\(root:\*:0:\).*/\1/' /etc/group
(顺便说一句,使用orcat
时从来没有必要,只需提供文件作为命令行参数)。sed
awk
然而,@Shawn 提出的解决方案在这方面更加优雅。