RSS를 더 쉽게 작성하기 위해 쉘 스크립트를 작성하고 있습니다. 이제 파일을 올바르게 편집하는 방법에 대해 고민하고 있습니다. 보세요, 저는 프로그램이 나에게서 데이터를 가져온 다음 이를 변수에 저장하기를 원합니다. 그런 다음 쉘 스크립트가 내 XML 파일을 탐색하고, 주어진 줄에 대한 변수를 입력한 다음, <language></language>
내 태그 아래 줄 에 내 최신 게시물이 포함된 새 XML 파일을 저장하게 되기를 원합니다 . 이것은 내 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을 사용하지 마세요. 정말 끔찍한 Zhu Zhu입니다. 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"