замена строки переменной строкой - PullRequest
0 голосов
/ 28 марта 2020

У меня есть две директории, S и T, каждая из которых содержит 150 файлов. Имена файлов идентичны, поэтому, например, если S содержит файл1, файл2, ..., файл150, то T также содержит файл1, файл2, ..., файл150. Каждый файл в S содержит именно этот код:

<a href="index.php">Home</a>  &rarr; <a href="page1.php">Page 1</a> 
&rarr;  NAME1  <a href="A.php"> &rarr Previous</a> <a href="B.php">Next  &rarr </a>

, где все идентично во всех 150 файлах, кроме NAME1, то есть NAME2 для файла2, NAME3 для файла3, et c.

Каждый файл в T содержит именно этот код:

<a href="index.php">Home</a>  &rarr; <a href="page1.php">Page 1</a> 
&rarr;  STRING1  <a href="X1.php"> &rarr Previous</a> <a href="Y1.php">Next  &rarr </a>

, где STRING1 для файла1, STRING2 для файла2 и т. Д. c. являются (довольно длинными) строками другого кода, который изменяется для каждого файла, и X1, Y1 также различны для каждого файла: X2, Y2 для файла2, X3, Y3 для файла3 и т. д. c.

Я хотел бы написать сценарий оболочки, который заменяет строки X1, Y1, найденные в T / file1, на строки A, B в S / file1, X2, Y2, найденные в T / file2, на строки A, B в S / file2 и так далее. Я работаю с Терминалом на Ма c или на компьютере с Ubuntu. Я выполнил поиск в Интернете и на этом форуме и попытался использовать sed и awk, но я не смог заставить что-либо работать правильно. Спасибо за любую помощь или предложения.

Я приведу пример с двумя файлами вместо 150. Предположим, у меня готов сценарий к go. Перед выполнением сценария в каталоге S есть файл file1 с содержимым

N1 A B

и файл file2 с содержимым

N2 A B

, а в каталоге T есть файл file1 с содержимым

S1 X1 Y1

и файл file2 с содержимым

S2 X2 Y2

После выполнения сценария S имеет файл file1 с содержимым

N1 X1 Y1

и файл file2 с содержимым

N2 X2 Y2

пока каталог Т не изменился.

Я бы хотел, чтобы это было сделано для всех 150 файлов при запуске сценария.

1 Ответ

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

Что-то вроде этого, вероятно, самое простое:

for path in S/*; do
    file="${path#*/}"
    awk '
        NR==FNR { $1=""; vals[NR]=$0; next }
        { print $1 vals[FNR] }
    ' "T/$file" "S/$file" > tmp &&
    mv tmp "S/$file"
done

Для чего-то такого тривиального, как последний опубликованный вами пример, вам не нужно использовать awk как этот, но из вашего исходного примера это звучит так, как будто у вас есть некоторые более сложная обработка, поэтому я показал, куда вписать сценарий awk в процесс.

...