Заменить каждое вхождение слова каждой строкой из списка файлов - PullRequest
1 голос
/ 30 марта 2020

Я хочу назвать каждый файл .tar в приведенном ниже коде и назвать его на основе списка файлов, который содержит имена, но я не хочу связываться с тегом исключения. У меня есть файл списка, и я думал об использовании текстового редактора и добавлении cvf в начало каждой строки в списке, а затем с помощью sed заменил строку cvf , добавив таким образом флаг и затем имя следует

т.е. cvf name1 cvf name2 cvf name3

Я попытался использовать sed 's/cvf/word2/g' input.file и, как и ожидалось, он заменяет только cvf словом замены. Я хочу, чтобы заменяющее слово (word2) изменялось и было каждой строкой из файла списка.

Код, который я хочу изменить: stage ('Zip Repo340') { steps { sh""" tar --exclude='*.tar' -cvf .tar * """ stage ('Zip Repo341') { steps { sh""" tar --exclude='*.tar' -cvf .tar * """ stage ('Zip Repo342') { steps { sh""" tar --exclude='*.tar' -cvf .tar * """

У меня 340 из эти репозитории, и я хочу назвать их, основываясь на имеющемся у меня файле списка.

Файл списка:

name1 name2 name3

Требуемый вывод:

stage ('Zip Repo340') { steps { sh""" tar --exclude='*.tar' -cvf name1.tar * """ stage ('Zip Repo341') { steps { sh""" tar --exclude='*.tar' -cvf name2.tar * """ stage ('Zip Repo342') { steps { sh""" tar --exclude='*.tar' -cvf name3.tar * """

Я могу добавить cvf к каждой строке моего файла списка, но если есть более элегантное решение, я весь слух. Самая большая проблема, с которой я столкнулся, - это запуск команды sed replace, и слово замены приходит из файла списка.

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Это сделает это. Предполагая, что File_1.txt имеет ваш код, а File_2.txt имеет имена для замены.

while IFS= read -r line; do
    sed -i "0,/cvf \.tar/{s|cvf \.tar|cvf ${line}\.tar|}" File_1.txt
done < File_2.txt

Что здесь происходит?

  1. sed -i <gobledegook> File_1.txt Мы вносим изменения в File_1.txt. Какие изменения? Давайте рассмотрим сценарий sed, который является <gobledegook>
  2. "0,/<gobledegook> Это говорит о том, что мы будем искать first вхождение что-то
  3. "0,/cvf \.tar/<gobledegook> То, что что-то , которое мы будем искать, будет cvf .tar Мы должны были сказать \.tar, потому что . - это «специальный символ»
  4. "0,/cvf \.tar/{s|<gobledegook>} Мы говорим здесь, что в строке, что наша строка поиска существует, мы хотим сделать еще один сценарий sed. Новый сценарий sed определен в {}. Я решил использовать | в качестве разделителя для второго сценария sed, чтобы помочь различить guish двух.
  5. "0,/cvf \.tar/{s|cvf \.tar|} Мы собираемся замените cvf .tar на что-то
  6. "0,/cvf \.tar/{s|cvf \.tar|cvf ${line}\.tar|}" Мы собираемся заменить cvf .tar на cfv ${line}.tar, где ${line} - текущая строка из File_2.txt

Очень похоже на эту проблему

1 голос
/ 30 марта 2020

Вы можете сделать что-то вроде:

SCRIPT_NAME='outScript.sh'
while read filename; do
  # Replace only the first match:
  sed "0,/-cvf \.tar/s/-cvf \.tar/-cvf ${filename}.tar/" $SCRIPT_NAME > /tmp/tmp.sh
  mv /tmp/tmp.sh $SCRIPT_NAME
done < all_filenames.txt 

По сути, вы go просматриваете свой файл имен, и для каждого имени вы заменяете первое незаменяемое совпадение

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