Как заменить вхождение одной строки чтением значений из другой и созданием разных файлов - PullRequest
0 голосов
/ 31 марта 2020

Я новичок ie и пытаюсь достичь чего-то вроде ниже. Любая помощь будет принята с благодарностью.

File 1:
AAA
BBB
CCC
DDD
File 2:
This is the first line:
This is the 2nd line: Some Text Some Text A=XXX
This is the 3rd line: Some Text Some
This is the 4th line: Some Text Some K_XXX Some Text Some 
This is the 5th line: DXXX

Я хочу написать скрипт, который будет принимать аргументы из File1 один за другим и заменять его на все вхождения XXX в File2, а затем создавать новые файлы. как указано ниже:

File2_AAA.txt (Содержит все из File2 с XXX, замененным AAA)

File2_BBB.txt (Содержит все из File2 с XXX, замененным BBB)

File2_ CCC .txt (Содержит все, начиная с File2, где XXX заменяется на CCC). .

ET C

Я написал приведенный ниже код, но он не работает

#!/bin/bash
while IFS= read -r line; do

   sed -i 's/\bXXX\b/"$line"/g' file2.txt 
done < file1.txt

1 Ответ

0 голосов
/ 02 апреля 2020

Вот модифицированная версия вашего скрипта:

#!/bin/bash
while IFS= read -r line; do
  sed "s/\bXXX\b/$line/g" < file2.txt > "File2_$line.txt"
done < file1.txt

С file1.txt и file2.txt, определенными как в вашем вопросе, он записывает от File2_AAA.txt до File2_DDD.txt, с (например) File2_BBB.txt, содержащий:

This is the first line:
This is the 2nd line: Some Text Some Text A=BBB
This is the 3rd line: Some Text Some
This is the 4th line: Some Text Some K_XXX Some Text Some
This is the 5th line: DXXX

Обратите внимание, что только первое вхождение XXX заменяется из-за \b утверждений о границе слов в регулярном выражении.

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

Второй - это одинарные кавычки в аргументе sed , что предотвращает расширение $line. Вместо этого я использовал двойные кавычки.

...