使用文件名重命名多个文件中的特定实例?

时间:2016-08-31 22:43:28

标签: python bash perl

我必须在目录中创建大约500个xml文件的副本,我设法完成了。作为下一个问题的一部分,我想重命名文件中的特定文本。我该怎么做呢?

这就是我所拥有的: 1000.xml,1001.xml,1002.xml ......

1000.xml:

            $('html').addClass('jsEnabled');
            $(function(){   
            $('#particles-js').hide(0).delay(1000).fadeIn(400);
            $('header').hide(0).delay(1000).fadeIn(300);
            $('#intro1').hide(0).delay(1300).fadeIn(300);
            $('#intro2').hide(0).delay(1800).fadeIn(300);
            $('#down').hide(0).delay(2000).fadeIn(300);
            $('#arrow').delay(2200).show('slide',{direction:'up'},400);


            /// Scroll down 
            $(window).scroll(function(){
                $('#intro').css("opacity",1-$(window).scrollTop()/300);
            });
            $(window).scroll(function(){
                $('#arrow').css("opacity",1-$(window).scrollTop()/100);
            });
            $(window).scroll(function(){
                if($(this).scrollTop()>50){
                    $('#case-studies,#connect').fadeIn(); 
                } else {
                    $('#case-studies,#connect').fadeOut();
                }
            /// Scroll back to top
            $("a[href='#case-studies']").click(function() {
            $("html, body").animate({ scrollTop: 0 }, "slow");
            return false;
                });
            }); 
            $("body").css("height",window.outerHeight + 200 + "px");    

            $(window).on('resize',function(){ /// for resize
                $('#intro').css('margin-top', function () {
                return ($(window).height() - $(this).height()) / 3
            });
            }).resize();
            /// Fadeout on page load
            $("a.transition").click(function(event){
                event.preventDefault();
                linkLocation = this.href;
                $("body").fadeOut(1000,redirectPage);
            });

            function redirectPage() {
                window.location = linkLocation;
            }

             $('#back-to-middle').on('click', function (e) {
                    e.preventDefault();
                    $('html,body').animate({
                        scrollTop: 600
                    });
                });




        });

基本上,这会复制到所有其他文件,但具有数字和时间顺序的名称。如何用“文件名”替换“1000”?所以,新文件应该是 - 1001.xml:

<?xml version="1.0" encoding="UTF-8"?>
<addresses xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation='test.xsd'>
<address>
    <name>Joe Tester</name>
    <street>Baker street 5</street>
    <id>1000</id>
</address>
<count>1000</count>

我只能这样做 - <?xml version="1.0" encoding="UTF-8"?> <addresses xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation='test.xsd'> <address> <name>Joe Tester</name> <street>Baker street 5</street> <id>1001</id> </address> <count>1001</count> </addresses> 将用1001替换所有1000,而不是文件名。

3 个答案:

答案 0 :(得分:3)

您已对其进行了标记OptionDateTimeColumn,以便我可以这样做:

perl

这使用#!/usr/bin/perl use strict; use warnings; use XML::Twig; #iterate the files. foreach my $xml_file ( glob "*.xml" ) { #regex match the number for the XML. my ( $file_num ) = $xml_file =~ m/(\d+).xml/; #create an XML::Twig, and set it to 'indented' output. XML::Twig -> new ( pretty_print => 'indented', #matches elements and runs the subroutine on 'it'. ($_) is the #current element in this context. twig_handlers => { 'address/id' => sub { $_ -> set_text($file_num) }, 'count' => sub { $_ -> set_text($file_num) }, #parsefile_inplace reads and writes back any changes to the file #as it goes. } ) -> parsefile_inplace($xml_file); } ,允许您进行就地编辑。它通过元素处理程序执行此操作,元素处理程序在匹配合适的匹配项时,使用正确的文件数值替换内容。

我选择替换XML::Twigaddress/id的已定义内容,而不仅仅是直接搜索和替换,因为那样......你不必担心约count显示内容中的任何其他位置。 (就像地址一样)。

答案 1 :(得分:2)

在解密您的问题之后,我发现您想要将xml文件中的实际内容,即id或其他节点的文本更改为文件名,因此请使用xml解析器,如lxml

from  glob import iglob
import lxml.etree as et

for fle in iglob("[0-9][0-9][0-9][0-9].xml"):
    tree = et.parse(fle)
    id_ = tree.find(".//id").text = fle
    tree.write(fle, encoding="utf-8")

如果您想更改计数,请使用:

 for fle in iglob("[0-9][0-9][0-9][0-9].xml"):
        tree = et.parse(fle)
        id_, count = tree.find(".//id"), tree.find(".//count")
        id_.text = count.text = fle
        tree.write(fle, encoding="utf-8")

无论要将哪个文本设置为文件名,只需查找包含find的节点并使用 node.text = ... 逻辑设置文本。如果你想使用忽略扩展的名称,只需拆分:

for fle in iglob("[0-9][0-9][0-9][0-9].xml"):
        tree = et.parse(fle)
        id_, count = tree.find(".//id"), tree.find(".//count")
        id_.text = count.text = fle.split(".")[0]
        tree.write(fle, encoding="utf-8")

答案 2 :(得分:1)

在循环中尝试sed命令 -

for i in {1000..1500} #or whatever your maximum number is
do
sed -i "s/1000/"$i"/g" "$i".xml
done