在UNIX中循环并组合两个文件

时间:2009-03-22 00:05:18

标签: unix for-loop

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

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

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

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

非常感谢任何帮助!

谢谢, 麦克

2 个答案:

答案 0 :(得分:4)

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

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

这假设您的标题都没有包含斜杠。

答案 1 :(得分: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 }”,然后为该文件授予执行权限。


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

#!/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,