Bash - 如何从bash编辑docks配置文件

时间:2014-08-09 18:35:45

标签: regex bash sed

我想从两个配置文件中删除一些包含特定字符串的行。这些文件用于码头:Wbar& SimDock。我试图完成我的bash脚本,但我找不到有效的方法。

这是我的第一个文件" $ HOME / .wbar":

i: /usr/share/pixmaps/wbar/dock.png
c: wbar --bpress --above-desk --pos top --grow --isize 48 --idist 3 --nanim 4 --falfa 65 --filter 0
t: /usr/share/fonts/truetype/liberation/LiberationMono-Bold/10

i: /usr/share/icons/nuoveXT2/128x128/apps/firefox.png
c: /usr/bin/www-browser
t: Web Browser

i: /usr/share/icons/nuoveXT2/128x128/apps/gthumb.png
c: gpicview
t: Image Viewer

i: /usr/share/icons/nuoveXT2/128x128/devices/media-cdrom-audio.png
c: audacious
t: Audio Player : Audacious

i: /usr/share/icons/nuoveXT2/128x128/apps/text-editor.png
c: medit
t: Text Editor

i: /usr/share/icons/nuoveXT2/128x128/apps/kfm.png
c: xfe
t: File Manager Xfe

i: /usr/share/icons/nuoveXT2/128x128/apps/terminal.png
c: xfce4-terminal
t: Terminal

i: /usr/share/pixmaps/wbar/wbar.png
c: wbar-config
t: Configure Wbar

i: /home/inukaze/dosbox/bchess/bchess.png
c: /home/inukaze/dosbox/bchess/bchess.sh
t: DosBox BattleChess

如何删除" Battle Chess" +最后的空白?我应该使用sed还是其他方法?我试过以下但是没有用。

$ sed -i 'i: /home/inukaze/dosbox/bchess/bchess.png/d'
sed: -e expression #1, character 6: unknown order : «u»

我也在尝试修改以下文件," launchers.xml":

<?xml version="1.0" encoding="utf-8"?>
<Program>
  <SimDock>
    <path>/usr/bin/firefox</path>
    <icon>/usr/share/firefox/icons/mozicon128.png</icon>
    <description>Firefox web browser</description>
    <name>Firefox</name>
  </SimDock>
  <SimDock>
    <path>/home/inukaze/dosbox/bchess/bchess.sh</path>
    <icon>/home/inukaze/dosbox/bchess/bchess.png</icon>
    <description>Launch The BattleChess MS-D.o.s Game</description>
    <name>BattleChess</name>
  </SimDock>
</Program>

这个问题是每个条目都包含在<SimDock></SimDock>部分中,该部分也必须删除。我还想删除与#34; BattleChess&#34;相对应的部分。从这个文件。

如何使用sed或其他方法从这两个文件中删除这些部分?

2 个答案:

答案 0 :(得分:1)

第一个问题:sed变得困惑,因为你的路径中有很多(未转义的)斜杠。最简单的方法是使用除正斜杠之外的其他控制字符(即&#39; @&#39;或&#39; +&#39; - 可以使用任何东西)。

......但是这也应该这样做:

sed '/\(bchess\|BattleChess\)/d' -i yourfile

(在你的情况下&#39; /([cC] hess)/ d&#39;也会有用)

答案 1 :(得分:1)

这是一种使用Perl单线程从第一个文件中删除“bchess”部分的方法:

$ perl -00 -ne 'chop; $_ = "\n$_" if $. > 1; print unless /bchess/' wbar

一次读取一个块。使用chop删除最后一个换行符。在第一个部分之后的每个部分之前添加换行符。如果该部分不包含“bchess”,则打印该部分。

上述方法可防止文件底部的尾部换行符。如果你不为此烦恼,你可以选择更简单的东西,比如:

perl -00 -ne 'print unless /bchess/' wbar

只打印与“bchess”不匹配的每个块。

对于XML文件,我建议使用XML解析器,例如XML::LibXML Perl模块:

use strict;
use warnings;
use XML::LibXML;

my $parser = XML::LibXML->new();
my $xmldoc = $parser->parse_file(shift);
for my $dead ($xmldoc->findnodes(q{/Program/SimDock[name = "BattleChess"]})) {
    $dead->unbindNode;
}
print $xmldoc->toString;

用法:perl script.pl filename.xml > newfile.xml

这将删除XML文件中<name>标记包含“BattleChess”的部分。