Bash

去掉最後兩個恩德__和ndend與 sed?

  • November 26, 2013

我正在編寫一個改進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

引用自:https://unix.stackexchange.com/questions/102223