使用 sed 或 awk 删除模式后的所有内容

使用 sed 或 awk 删除模式后的所有内容

我知道有很多关于它的问题,但我无法让它发挥作用。

我想用或清理一个组(例如root)。所以我需要删除之后的所有内容/etc/groupsedawkroot:*: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时从来没有必要,只需提供文件作为命令行参数)。sedawk

然而,@Shawn 提出的解决方案在这方面更加优雅。

相关内容