制作 Shell 脚本写入 XML 文件

制作 Shell 脚本写入 XML 文件

我正在编写一个 shell 脚本,以使编写 RSS 变得更加容易。现在我陷入了如何正确编辑我的文件的困境。看,我希望程序从我这里获取数据,然后将它们保存到变量中。然后,我希望 shell 脚本导航到我的 XML 文件,输入给定行的变量,然后将新的 XML 文件与我的最新帖子一起保存在我的<language></language>标签下的行中。这是我的 XML 和 Shell 脚本的视图。我目前正在使用 OSX,并且我知道我使用有趣的变量名称:)

XML:

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>CJ Cahala's Blog Feed</title>
<link>http://www.cjcahala.net/</link>
<description>This is my blog in RSS Form</description>
<lastBuildDate>Mon, 29 Sep 2014 09:16:00 GMT</lastBuildDate>
<language>en-us</language>
<item>
    <title>Hey Guys! Namecheap accepts Bitcoin! Awesome!</title>
    <link>http://namecheap.com/</link>
    <guid>http://namecheap.com/</guid>
    <pubDate>Thu, 2, Oct 2014, 00:15:00 GMT</pubDate>
    <description>Namecheap has web hosting and a payment option for Bitcoin!</description>
</item>
<item>
    <title>This is my first post</title>
    <link>http://www.cjcahala.net/resume.html</link>
    <guid>http://www.cjcahala.net/resume.html</guid>
    <pubDate>Mon, 29 Sep 2014 09:16:00 GMT</pubDate>
    <description>Hey there, this is my resume- check it out if you want!</description>
</item>
</channel>
</rss>

壳:

#!/bin/bash 
read -p "Channel Title:" ct
read -p "Channel Description:" chand
read -p "Post Title:" pt
read -p "Post Link:" pl
read -p "Post GUID (same URL as link):" pg
read -p "Post Description:" pd
dater=`date`
dirt=/Users/cjcahala/Desktop/test.xml
echo "hello\n"$dater > $dirt

答案1

不要这样做 XML。真是糟糕的朱朱啊。 XML 不是面向行的数据结构,因此您所做的操作会创建脆弱的代码。

XML 解析器是前进的方向。大多数语言都有它们。我喜欢 Perl 和XML::Twig.

#!/usr/bin/env perl

use strict;
use warnings;

use XML::Twig;

sub insert_new_post {
    my ( $twig, $lang_elt ) = @_;
    my $new_item = XML::Twig::Elt->new('item');
    #you can probably omit the 'last_child' field, as the RSS readers aren't 
    #going to care about ordering, probably. 
    $new_item->insert_new_elt( 'last_child', 'title', "New title" );
    $new_item->insert_new_elt( 'last_child', 'link',  "http://unix.stackexchange.com" );
    $new_item->insert_new_elt( 'last_child', 'guid', "Somenew GUID" );
    $new_item->insert_new_elt( 'last_child', 'pubdate', "Today or something" );
    $new_item->insert_new_elt( 'last_child', 'description', "Fishy fishy fishy" );
    print "Inserting:\n", $new_item->sprint, "\n";
    $new_item->paste_after($lang_elt);
}

my $twig = XML::Twig->new(
    'pretty_print'  => 'indented',
    'twig_handlers' => { 'language' => \&insert_new_post },
);
$twig->parsefile ( 'your_file.xml' );
$twig->print;  #prints to stdout. 

答案2

不确定是否仍然需要答案。您可以用来xmlstarlet编辑 XML 模板。例如,

xmlstarlet edit --update '/rss/channel/title' --value "$ct" "$dirt"

相关内容