Bash
去掉最後兩個恩德__和ndend與 sed?
我正在編寫一個改進
fluxbox
“菜單”的腳本,我的腳本有這一行:sed -i 's/\[end]//g' ~/.fluxbox/menu;sed -i '/^\s*$/d' ~/.fluxbox/menu
但這有去除所有不好的東西的不幸效果
[end]
,我只希望它去除[end]
該文件中的最後兩次出現。那麼請問我該怎麼做呢?
最簡單的可能是使用
perl
’s slurp模式:perl -0777 -pi -e 's/(.*)\[end]/$1/s;s/(.*)\[end]/$1/s;s/^\s*\n//gm' ~/.fluxbox/menu
類似於
perl
的 slurp 模式sed
可以將整個文件讀入保持緩衝區(“保持空間”),從而可以將文件內容視為“模式空間”中的單行(更多資訊請參閱sed 和多行搜尋和替換)。只有一個大的單行,
sed
正則表達式的貪婪性質然後很容易去除[end]
給定文件中最後兩個出現的 (實際上與Stephane Chazelas 接受的解決方案的 Perl 正則表達式邏輯相同)。#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