我想从两个配置文件中删除一些包含特定字符串的行。这些文件用于码头: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或其他方法从这两个文件中删除这些部分?
答案 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”的部分。