Цикл и объединение двух файлов в UNIX - PullRequest
0 голосов
/ 22 марта 2009

Это должно быть просто для тех из вас, у кого есть знания в области программирования ... К сожалению, нет.

Я пытаюсь перебрать текстовый файл с заголовками изображений и добавить их в качестве тегов заголовков в HTML-файл. Файл подписей к изображениям имеет 105 подписей (каждый разделен символом возврата каретки), а файл галереи содержит пустые теги alt для каждого тега (устанавливается как alt = "#"). Порядок подписей соответствует порядку изображений в html-файле.

То есть, другими словами ... код psuedo будет выглядеть следующим образом: «Проходить по каждой строке в captions.txt и для каждого alt =" # "в файле gallery.html заменить # соответствующим заголовком."

Я на Mac, поэтому я хотел бы использовать UNIX.

Любая помощь очень ценится!

Спасибо, Mike

Ответы [ 2 ]

4 голосов
/ 22 марта 2009

Если все alt="#" находятся в отдельных строках, вы можете использовать ed:

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

Предполагается, что ни одна из ваших подписей не содержит косую черту.

2 голосов
/ 22 марта 2009

Есть много способов достичь этой цели. awk - классическая программа для работы с текстом. (Ну, awk и sed, для разных целей, но 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,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...