![用 sed 去掉最后两个 [end] ?](https://linux22.com/image/4427/%E7%94%A8%20sed%20%E5%8E%BB%E6%8E%89%E6%9C%80%E5%90%8E%E4%B8%A4%E4%B8%AA%20%5Bend%5D%20%EF%BC%9F.png)
我正在编写一个改进fluxbox
“菜单”的脚本,我的脚本有这一行:
sed -i 's/\[end]//g' ~/.fluxbox/menu;sed -i '/^\s*$/d' ~/.fluxbox/menu
但这会带来不幸的后果全部哪个[end]
不好,我只希望它删除[end]
该文件中最后两次出现的 。那么我该怎么做呢?
答案1
最简单的可能是使用perl
's吸食模式:
perl -0777 -pi -e 's/(.*)\[end]/$1/s;s/(.*)\[end]/$1/s;s/^\s*\n//gm' ~/.fluxbox/menu
答案2
类似于perl
slurp 模式sed
可以将整个文件读入保持缓冲区(“保持空间”),以便文件内容可以被视为“模式空间”中的单行(更多信息请参见sed 和多行搜索和替换)。
由于只有一行代码,正sed
则表达式的贪婪特性使得它能够轻松地删除[end]
给定文件中的最后两次出现(几乎与 Perl 正则表达式的逻辑相同)Stephane Chazelas 接受的解决方案)。
#sed -i -n -e '1h;1!H;${;g; s/\(.*\)\[end\]/\1/; s/\(.*\)\[end\]/\1/; p;}' file # does not work on Mac OS X 10.6.8
sed -n -i -e '1h;1!H;${;g; s/\(.*\)\[end\]/\1/; s/\(.*\)\[end\]/\1/; p;}' file # note: -n precedes -i
# ... plus deleting all blank lines
sed -n -i -e '1h;1!H;${;g; s/\(.*\)\[end\]/\1/; s/\(.*\)\[end\]/\1/; s/^[[:space:]]*\n//; s/\n[[:space:]]*$//; s/\n[[:space:]]*\n/\
/g; p;}' file