sedを使用して最後の2つ[end]を削除しますか?

sedを使用して最後の2つ[end]を削除しますか?

「メニュー」を改善するためのスクリプトを作成していますが、スクリプトにはfluxbox次の行があります。

sed -i 's/\[end]//g' ~/.fluxbox/menu;sed -i '/^\s*$/d' ~/.fluxbox/menu

しかし、これは不幸な結果につながる可能性がありますみんな悪い点は、ファイルから最後の2つの項目[end]だけを削除したいと思います。[end]ではどうすればいいですか?

答え1

最も簡単なのはおそらくperl'を使うことです。喫煙モデル:

perl -0777 -pi -e 's/(.*)\[end]/$1/s;s/(.*)\[end]/$1/s;s/^\s*\n//gm' ~/.fluxbox/menu

答え2

perlslurpモードと同様に、sedファイル全体を保持バッファ(「保持空間」)として読み取ることができるため、ファイルの内容は「パターン空間」の単一行として扱われます(詳細は参照)。sed と複数行の検索と置換)。

1行のコードだけで、sed正規表現の欲張りな特性により、与えられた[end]ファイルから最後の2つのエントリを簡単に削除できます(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

関連情報