0

对于那些有一些编程知识的人来说,这应该很简单......不幸的是我没有。

我正在尝试遍历图像标题的文本文件并将它们作为标题标签添加到 html 文件中。图片标题文件有 105 个标题(每个标题由回车分隔),图库文件的每个 a 标签上都有空白 alt 标签(设置如 alt="#")。标题的顺序与 html 文件中图像的顺序相对应。

所以换句话说......伪代码将是:“遍历captions.txt中的每一行以及gallery.html文件中的每个alt="#",将#替换为相应的标题。”

我在 Mac 上,所以我想使用 UNIX。

任何帮助是极大的赞赏!

谢谢,迈克

4

2 回答 2

4

如果所有这些alt="#"都在不同的行上,则可以使用 ed:

{
  while read cap
    do echo "/alt=\"#\"/ s//alt=\"$cap\"/"
  done < captions.txt
  echo wq
} | ed gallery.html

这假设您的任何字幕都不包含斜线。

于 2009-03-22T00:17:38.063 回答
2

有很多方法可以实现这一目标。 awk是经典的文本操作程序。(嗯,awksed,用于不同的目的,但sed在这里无济于事。)

awk '
    BEGIN {
        caps = ARGV[1]
        delete ARGV[1]
    }
    /#/ {
        getline cap < caps
        gsub("#", cap)
    }
    { print }
' captions.txt gallery.html

您可以将其放入脚本中以避免多次键入。只需用“ #!/usr/bin/awk -f”开始一个纯文本文件,将“ BEGIN ... { print }”放在它下面,并赋予文件执行权限。


这可以简单地翻译成大多数脚本语言。珀尔:

#!/usr/bin/perl -p
BEGIN { open CAPS, shift }
if (/#/) {
    chomp($cap = <CAPS>);
    s/#/$cap/g;
}

在 Ruby 中几乎相同:

#!/usr/bin/ruby
caps = IO.readlines(ARGV.shift).each {|s| s.chomp!}
while gets
    $_.gsub!(/#/, caps.shift) if $_ =~ /#/
    print
end

和 Python:

#!/usr/bin/python
import sys
caps = [s.strip() for s in file(sys.argv[1]).readlines()]
for f in [file(s, 'r') for s in sys.argv[2:]] or [sys.stdin]:
    for s in f:
        if s.find('#') > 0: s = s.replace('#', caps.pop(0))
        print s,
于 2009-03-22T18:38:15.593 回答