Macos sed命令删除第一个出现的单词

Macos sed命令删除第一个出现的单词,macos,sed,Macos,Sed,我想知道如何删除文件中第一个出现的单词 示例:我只想删除第一次出现的admin account required pam_opendirectory.so account sufficient pam_self.so account required pam_group.so no_warn group=admin,wheel fail_safe account required pam_group.so no_warn den

我想知道如何删除文件中第一个出现的单词

示例:我只想删除第一次出现的admin

account    required       pam_opendirectory.so
account    sufficient     pam_self.so
account    required       pam_group.so no_warn group=admin,wheel fail_safe
account    required       pam_group.so no_warn deny group=admin,wheel ruser fail_safe
我试过:

sudo sed -i.bak "s/admin,//1" /etc/pam.d/screensaver
但这两种情况都没有了,有什么想法吗?

使用sed 要删除文件中的第一个匹配项,请执行以下操作:

$ sed -e ':a' -e '$!{N;ba;}' -e 's/admin,//1' file
account    required       pam_opendirectory.so
account    sufficient     pam_self.so
account    required       pam_group.so no_warn group=wheel fail_safe
account    required       pam_group.so no_warn deny group=admin,wheel ruser fail_safe
以上内容已通过GNU sed进行了测试

工作原理 -e':a'-e'$!{N;ba;}'

这会立即将整个文件读入模式空间。如果您的文件太大,内存不足,这不是一个好方法

-e's/admin,//1'

这将在admin的第一次出现和仅第一次出现时执行替换

使用BSD OSX sed Wintermute报告BSD sed无法在一行程序中执行分支指令,并建议使用以下替代方法来更改文件:

sed -i.bak -n '1h; 1!H; $ { x; s/admin,//; p; }' file
这将一次读取整个文件,然后在读取最后一行后进行替换

更详细地说:

-n

默认情况下,sed将打印每一行。这就把它关掉了

1h

这会将第一行放在保持缓冲区中

一!!H

对于所有后续行,这会将它们附加到保持缓冲区

${x;s/admin,//;p;}

对于最后一行$,这将交换保持和模式缓冲区,以便模式缓冲区现在具有完整的文件。s/admin,//进行替换,p打印结果

使用awk 这导致:

account    required       pam_opendirectory.so
account    sufficient     pam_self.so
account    required       pam_group.so no_warn group=wheel fail_safe
account    required       pam_group.so no_warn deny group=admin,wheel ruser fail_safe
工作原理 /管理员,/&!f{sub/admin,/,;f=1}

对于每一行,检查它是否包含单词admin,以及标志f是否仍有其默认值零。如果是,请删除第一次出现的admin,并将标志设置为1

一,

打印每一行。1是awk对{print$0}的神秘速记

使用sed 要删除文件中的第一个匹配项,请执行以下操作:

$ sed -e ':a' -e '$!{N;ba;}' -e 's/admin,//1' file
account    required       pam_opendirectory.so
account    sufficient     pam_self.so
account    required       pam_group.so no_warn group=wheel fail_safe
account    required       pam_group.so no_warn deny group=admin,wheel ruser fail_safe
以上内容已通过GNU sed进行了测试

工作原理 -e':a'-e'$!{N;ba;}'

这会立即将整个文件读入模式空间。如果您的文件太大,内存不足,这不是一个好方法

-e's/admin,//1'

这将在admin的第一次出现和仅第一次出现时执行替换

使用BSD OSX sed Wintermute报告BSD sed无法在一行程序中执行分支指令,并建议使用以下替代方法来更改文件:

sed -i.bak -n '1h; 1!H; $ { x; s/admin,//; p; }' file
这将一次读取整个文件,然后在读取最后一行后进行替换

更详细地说:

-n

默认情况下,sed将打印每一行。这就把它关掉了

1h

这会将第一行放在保持缓冲区中

一!!H

对于所有后续行,这会将它们附加到保持缓冲区

${x;s/admin,//;p;}

对于最后一行$,这将交换保持和模式缓冲区,以便模式缓冲区现在具有完整的文件。s/admin,//进行替换,p打印结果

使用awk 这导致:

account    required       pam_opendirectory.so
account    sufficient     pam_self.so
account    required       pam_group.so no_warn group=wheel fail_safe
account    required       pam_group.so no_warn deny group=admin,wheel ruser fail_safe
工作原理 /管理员,/&!f{sub/admin,/,;f=1}

对于每一行,检查它是否包含单词admin,以及标志f是否仍有其默认值零。如果是,请删除第一次出现的admin,并将标志设置为1

一,

打印每一行。1是awk对{print$0}的神秘速记


使用sed,不读取整个文件:

sed 's/admin,//;tl;b;:l;n;bl' file
这将等待成功的替换,然后进入打印文件其余部分的循环

秘书/行政,;tl;b、 :用空字符串替换admin,如果替换发生,跳转到标签l,否则打印该行并退出下一行将以相同的方式处理

:l;Nbl:定义标签l,读取行,跳转到l


使用sed,不读取整个文件:

sed 's/admin,//;tl;b;:l;n;bl' file
这将等待成功的替换,然后进入打印文件其余部分的循环

秘书/行政,;tl;b、 :用空字符串替换admin,如果替换发生,跳转到标签l,否则打印该行并退出下一行将以相同的方式处理

:l;Nbl:定义标签l,读取行,跳转到l


给出了以下错误:sed:2:s/admin,//1:unexpected EOF pending}的sOP使用的是BSD sed附带的MacOS X。使用BSD sed,您无法或至少我没有找到在一行程序中使用b指令的方法。尝试sed-i.bak-n'1h;1.H、 美元{x;s/admin,//;p;}'文件,其工作方式基本相同,但在匹配之前使用不同的方式组装整个文件。两者都可以。BSD sed不接受没有争论的just-i,但是-i有效。顺便说一下:在BSDSED中,b指令不能在一行程序中工作的原因是类似ba;};stuff将b之后直到行尾的所有内容作为标签名,并尝试跳转到标签a;};东西这是非常愚蠢的,因为我认为BSD sed不可能声明名称中有分号的标签,但我有一条错误消息来证明这一点:sed'ba;stuff’给sed:1:ba;材料:未定义标签“a”;使用链接命令;在BSD s中
艾德很好。Vis-a-Vis{},需要知道的是,使用BSD sed,您需要一个;在}之前,GNU sed不需要{p}vs.{p;}。对于代码:1h将当前行复制到保持缓冲区(如果它是第一行)。1.如果不是第一个,则H会将其附加在那里。${…}执行某些操作,如果当前行是该点的最后一行,则整个文件都在保留缓冲区中。x交换保留缓冲区和模式空间,s/admin,//从PS中删除第一个admin,//p打印PS。选项-n禁用自动打印。@Techni1我添加了Wintermute命令的解释,并更新了awk命令以就地更改文件。给我这个错误:sed:2:s/admin,//1:unexpected EOF pending}的sOP正在使用MacOS x,这是BSD sed附带的。使用BSD sed,您无法或至少我没有找到在一行程序中使用b指令的方法。尝试sed-i.bak-n'1h;1.H、 美元{x;s/admin,//;p;}'文件,其工作方式基本相同,但在匹配之前使用不同的方式组装整个文件。两者都可以。BSD sed不接受没有争论的just-i,但是-i有效。顺便说一下:在BSDSED中,b指令不能在一行程序中工作的原因是类似ba;};stuff将b之后直到行尾的所有内容作为标签名,并尝试跳转到标签a;};东西这是非常愚蠢的,因为我认为BSD sed不可能声明名称中有分号的标签,但我有一条错误消息来证明这一点:sed'ba;stuff’给sed:1:ba;材料:未定义标签“a”;使用链接命令;在BSD中,sed很好。Vis-a-Vis{},需要知道的是,使用BSD sed,您需要一个;在}之前,GNU sed不需要{p}vs.{p;}。对于代码:1h将当前行复制到保持缓冲区(如果它是第一行)。1.如果不是第一个,则H会将其附加在那里。${…}执行某些操作,如果当前行是该点的最后一行,则整个文件都在保留缓冲区中。x交换保留缓冲区和图案空间,s/admin,//从PS中删除第一个管理员,p打印PS。选项-n禁用自动打印。@Techni1An我添加了对Wintermute命令的解释,并更新了awk命令以就地更改文件。