Bash 从文本文件中获取分隔文件名的列表
我是Bash的新手,所以这对你们大多数人来说可能听起来很愚蠢。 我正试图从文本文件中获取一些文件名的列表。试图用sed和awk来实现这一点,但在我有限的知识范围内无法实现 这是一个示例文件内容: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
<?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
部分。但是,对于文件中的所有文件字符串,情况可能并非如此。因此,请检查。Sed和awk通常不是读取XML的正确方法。它们可能有效,但XML可以随时更改布局并破坏内容,同时仍然是完全有效的XML 更好的方法是使用类似Perl的东西。通过CPAN或使用“sudo apt get Install libxml Smart perl”在UBTO上安装XML::Smart模块 然后是这样一个简单的脚本:tspan
另存为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 这: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"; }
- 解析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 /卷/Secondary500/Temp/Untitled-2_第1层副本2.pdf /卷/Secondary500/Temp/Untitled-2_Layer 1 copy.pdf /卷/Secondary500/Temp/Untitled-2_Layer 1.pdfawk'BEGIN{RS=“font size=\“10\”>|“}/pdf/'xml.txt
这段代码可能是最简单的代码,但没有凌乱的正则表达式,而且非常可扩展,您可以很容易地根据自己的喜好对其进行调整。我决定匹配术语“pdf”,因此代码的
部分,但如果您有其他文件要匹配,而这些文件不是pdf文件,但确实包含单词“Volumes”,您可以使用只需使用/pdf/
即可。是否在Mac上运行此功能?是否安装了fink或MacPorts?如果安装了fink或MacPorts,则“哪个xsltproc?”“,在命令提示下,告诉您?对于从XML文件中选择,解析它将是一个更好的选择,尤其是如果文件名周围的标记在不同的文件中可能具有不同的属性。您是否可以使用类似python脚本的东西,或者它必须是bash/awk/sed?sed-e/^[^>]*>/'-e's//Volumes/
@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\">|"}/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.pdfawk 'BEGIN{RS="font-size=\"10\">|</tspan>"}/pdf/' xml.txt