Bash 从文本文件中获取分隔文件名的列表

Bash 从文本文件中获取分隔文件名的列表,bash,shell,sed,awk,Bash,Shell,Sed,Awk,我是Bash的新手,所以这对你们大多数人来说可能听起来很愚蠢。 我正试图从文本文件中获取一些文件名的列表。试图用sed和awk来实现这一点,但在我有限的知识范围内无法实现 这是一个示例文件内容: <?xml version="1.0" encoding="utf-8"?> <!-- Generator: Adobe Illustrator 13.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> &l

我是Bash的新手,所以这对你们大多数人来说可能听起来很愚蠢。 我正试图从文本文件中获取一些文件名的列表。试图用sed和awk来实现这一点,但在我有限的知识范围内无法实现

这是一个示例文件内容:

<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 13.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 14948)  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
 width="471.677px" height="126.604px" viewBox="0 0 471.677 126.604" enable-background="new 0 0 471.677 126.604"
 xml:space="preserve">
<rect x="0.01" y="1.27" fill="none" width="471.667" height="125.333"/>
<text transform="matrix(1 0 0 1 0.0098 8.3701)"><tspan x="0" y="0" font-family="'MyriadPro-Regular'" font-size="10">/Volumes/Secondary500/Temp/Untitled-2_Layer 1 copy 2.pdf</tspan><tspan x="0" y="12" font-family="'MyriadPro-Regular'" font-size="10">/Volumes/Secondary500/Temp/Untitled-2_Layer 1 copy.pdf</tspan><tspan x="0" y="24" font-family="'MyriadPro-Regular'" font-size="10">/Volumes/Secondary500/Temp/Untitled-2_Layer 1.pdf</tspan></text>
</svg>

/Volumes/Secondary500/Temp/Untitled-2_Layer 1 copy 2.pdf/Volumes/Secondary500/Temp/Untitled-2_Layer 1 copy.pdf/Volumes/Secondary500/Temp/Untitled-2_Layer 1.pdf
我想从这个示例中获得一个新的文本文件,其内容如下:

/Volumes/Secondary500/Temp/Untitled-2\u第1层副本2.pdf
/Volumes/Secondary500/Temp/Untitled-2\u Layer 1 copy.pdf
/Volumes/Secondary500/Temp/Untitled-2_Layer 1.pdf

我想告诉sed打印“
font size“10”>
”和“
”之间的所有匹配条目,但是。。。我得到的最好的文件是一个整行包含我的字段分隔符的文件

如果你能解释一下每一步,那就太好了

  • 文件名可以是或多或少的。这3个只是一个例子
      这个怎么样:

      cat file.xml | sed -e's/^[^>]*>//' -e's/<.*$//' | grep \\.
      

      cat file.xml | sed-e的/^[^>]*>/'-e的/此命令的
      sed
      命令将

       sed  -n 's|font-size="[0-9]*".\(.*\)</tspan.*|\1|p' file.xml
                  -------------------  --  ---------
                     prefix part       \1   suffix
      

      请注意,获取正确的前缀和后缀字符串以获取所有匹配项非常重要。在您的示例中,这些是我在上面找到的
      font size
      tspan
      部分。但是,对于文件中的所有文件字符串,情况可能并非如此。因此,请检查。

      Sed和awk通常不是读取XML的正确方法。它们可能有效,但XML可以随时更改布局并破坏内容,同时仍然是完全有效的XML

      更好的方法是使用类似Perl的东西。通过CPAN或使用“sudo apt get Install libxml Smart perl”在UBTO上安装XML::Smart模块

      然后是这样一个简单的脚本:

      use strict;
      use diagnostics;
      
      use XML::Smart;
      
      my $xml = XML::Smart->new ("svg.xml") || die "Cannot read XML: $!.";
      my $version = $xml->{svg}{version} || die "Cannot determine SVG version.";
      
      foreach my $file ($xml->{svg}{text}{tspan}('@')) {
          print $file->content . "\n";
      }
      
      另存为svg.pl。将XML另存为svg.XML

      $perl svg.pl /卷/Secondary500/Temp/Untitled-2_第1层副本2.pdf /卷/Secondary500/Temp/Untitled-2_Layer 1 copy.pdf /卷/Secondary500/Temp/Untitled-2_Layer 1.pdf

      这:

      • 解析XML,检查它是否正确
      • 检查版本是否存在(实际上只是一个健全性检查)
      • 循环遍历所有svg/text/tspans的数组并打印内容

      玩得开心

      其他人已经给出了很好的答案,说明了如果您想解析XML,为什么应该使用适当的XML解析器,但关于如何在sed中实现这一点,如果您遇到类似的问题:

      #Full Command
      sed -n 's/^[^<]*<tspan[^>]*>\([^<]*\)<.*/\1/p'  ~/your_file.xml 
      
      #完整命令
      sed-n的/^[^\([^)。这也将被丢弃


      抓住结束括号之后的所有内容,这不是一个开放括号。这是我们想要保留的部分,因此我们将它括在转义括号中。”([^如果您有xmlgawk,您可以很容易地获得

      @load xml
      
      BEGIN {
          XMLMODE = 1;
          XMLCHARSET = "utf-8";
      }
      
      XMLCHARDATA {
          data = $0;
      }
      
      XMLENDELEM == "tspan" {
          print data;
      }
      

      awk'BEGIN{RS=“font size=\“10\”>|“}/pdf/'xml.txt
      
      结果 $awk'BEGIN{RS=“font size=\“10\”>|“}/pdf/'xml.txt /卷/Secondary500/Temp/Untitled-2_第1层副本2.pdf /卷/Secondary500/Temp/Untitled-2_Layer 1 copy.pdf /卷/Secondary500/Temp/Untitled-2_Layer 1.pdf
      这段代码可能是最简单的代码,但没有凌乱的正则表达式,而且非常可扩展,您可以很容易地根据自己的喜好对其进行调整。我决定匹配术语“pdf”,因此代码的
      /pdf/
      部分,但如果您有其他文件要匹配,而这些文件不是pdf文件,但确实包含单词“Volumes”,您可以使用只需使用
      /Volumes/
      即可。

      是否在Mac上运行此功能?是否安装了fink或MacPorts?如果安装了fink或MacPorts,则“哪个xsltproc?”“,在命令提示下,告诉您?对于从XML文件中选择,解析它将是一个更好的选择,尤其是如果文件名周围的标记在不同的文件中可能具有不同的属性。您是否可以使用类似python脚本的东西,或者它必须是bash/awk/sed?sed-e/^[^>]*>/'-e's/
      @load xml
      
      BEGIN {
          XMLMODE = 1;
          XMLCHARSET = "utf-8";
      }
      
      XMLCHARDATA {
          data = $0;
      }
      
      XMLENDELEM == "tspan" {
          print data;
      }
      
      $ xgawk -f pick_from_svg.awk sample.xml 
      /Volumes/Secondary500/Temp/Untitled-2_Layer 1 copy 2.pdf
      /Volumes/Secondary500/Temp/Untitled-2_Layer 1 copy.pdf
      /Volumes/Secondary500/Temp/Untitled-2_Layer 1.pdf
      
      awk 'BEGIN{RS="font-size=\"10\">|</tspan>"}/pdf/' xml.txt
      
      $ awk 'BEGIN{RS="font-size=\"10\">|"}/pdf/' xml.txt /Volumes/Secondary500/Temp/Untitled-2_Layer 1 copy 2.pdf /Volumes/Secondary500/Temp/Untitled-2_Layer 1 copy.pdf /Volumes/Secondary500/Temp/Untitled-2_Layer 1.pdf