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

Regex Bash-如何从Bash编辑docks配置文件,regex,bash,sed,Regex,Bash,Sed,我想从两个配置文件中删除一些包含特定字符串的行。这些文件用于dock:Wbar和SimDock。我正在尝试完成我的bash脚本,但是我找不到一个有效的方法 这是我的第一个文件“$HOME/.wbar”: 如何删除“战斗棋”+最后一个空格的行?我应该使用sed还是其他方法?我尝试了以下方法,但没有成功 $ sed -i 'i: /home/inukaze/dosbox/bchess/bchess.png/d' sed: -e expression #1, character 6: unknown

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

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

如何删除“战斗棋”+最后一个空格的行?我应该使用sed还是其他方法?我尝试了以下方法,但没有成功

$ sed -i 'i: /home/inukaze/dosbox/bchess/bchess.png/d'
sed: -e expression #1, character 6: unknown order : «u»
我还试图修改以下文件“launchers.xml”:


/usr/bin/firefox
/usr/share/firefox/icons/mozicon128.png
Firefox web浏览器
火狐
/home/inukaze/dosbox/bchess/bchess.sh
/home/inukaze/dosbox/bchess/bchess.png
启动战斗棋MS-D.o.s游戏
格斗棋
问题是,每个条目都包含在
节中,必须将其删除。我还想从这个文件中删除与“BattleChess”对应的部分


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

第一个问题:sed变得很混乱,因为您的路径中有很多(未缩放的)斜杠。最简单的方法是使用除正斜杠以外的其他控制字符(即'@'或'+'-可以使用任何字符)

……但这也应该做到:

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

(在您的情况下,“/([cC]hess)/d”也可以使用)

以下是一种使用Perl one liner从第一个文件中删除“bchess”部分的方法:

$ perl -00 -ne 'chop; $_ = "\n$_" if $. > 1; print unless /bchess/' wbar
一次一个地读每一块。用
chop
删除最后一行换行符。在第一节之后的每个节之前添加换行符。如果节不包含“bches”,则打印该节

上述方法防止在文件底部出现尾随换行符。如果您不为此烦恼,您可以选择更简单的方法,例如:

perl -00 -ne 'print unless /bchess/' wbar
它只打印每一个不匹配的块

至于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文件中
标记包含“BattleChess”的部分。

如果您在问题中显示了所需的输出,它将使您更清楚地知道您正试图做什么。您希望文件在之后看起来像什么?有很多类似的问题。虽然链接的问题可能不是精确的重复,但不难找到答案相似的类似问题。因此,我不认为这篇文章给StackOverflow知识库增加了什么新内容。我把这篇文章改为“新答案”
perl -00 -ne 'print unless /bchess/' wbar
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;