「メニュー」を改善するためのスクリプトを作成していますが、スクリプトには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
perl
slurpモードと同様に、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