ed не работает при циклическом прохождении скриптов в файловой оболочке - PullRequest
0 голосов
/ 22 октября 2019
#!/bin/bash
filename='urls.txt'
old_url="test"
while read line
do
  new_url=$line
  echo "New URL  is "$new_url
  echo -e '%s/'"$new_url"'/'"$old_url"'/g\nw' |ed ca-sample.conf
  old_url=$new_url
  echo ""
  echo "Old URL  is "$old_url
  sleep 60
done < $filename
exit

Я перебираю urls.txt, чтобы прочитать строки одну за другой, чтобы заменить старый URL новым. Эта команда (echo -e '% s /' "$ new_url" '/' "$ old_url" '/ g \ nw' | ed ca-sample.conf) отлично работает в командной строке (я установил new_url и old_urlкак переменные env "export new_url =" New "и" export old_url = "Old"), но когда я помещаю эту команду в цикл While, она не работает.

1 Ответ

0 голосов
/ 22 октября 2019

Повторное редактирование файла в цикле ужасно неэффективно. Вы, вероятно, хотите что-то вроде

awk -v old_url="test" '{ print "s%" old_url "%" $0 "%g"; old_url = $0 }' urls.txt |
tac |
sed -i~ - ca-sample.conf

Ваш sed может не принять сценарий при стандартном вводе;возможно сохраните сгенерированный скрипт во временном файле и передайте его вместо -.

, который я вставил в tac, чтобы новый URL-адрес не был сразу же заменен новым. В зависимости от того, как выглядят ваши данные и чего вы на самом деле пытаетесь достичь, это может быть совершенно неверно и / или потребовать дополнительных настроек (привязок регулярных выражений, с одной стороны?)

Подробная печать и длинная sleep кажется больше отвлекающим, чем полезным, хотя я полагаю, что вы могли бы взломать их обратно, если бы вы действительно этого хотели. Также обратите внимание на цитирование - вы цитируете буквальный текст (который не нуждается в цитировании) и оставляете переменные вне кавычек (что в точности должно быть внутри кавычек, чтобы цитаты были полезны привсе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...