Как заменить определенный текст в блоке текста значениями из другого файла?

Вы хотите использовать команду fc при указании списка вместо выполнения (-l)

fc -ln -1
0
25.05.2018, 11:47
2 ответа

Con awk, file2que contiene el texto de reemplazo y file1el texto repetido:

awk 'FNR == NR {baby[NR] = $0; next} /baby/ {count++; $NF = baby[count]} 1'  file2 file1

Tenga en cuenta que file2es el primer argumento del archivo aquí, no file1.

Explicación:

  • FNR == NRes cierto para el primer archivo leído por awk, así que file2aquí. Para ese archivo, guardamos cada línea en una matriz, indexada por número de línea
  • Para el segundo archivo, mantenemos un countde cada línea que coincida con baby, y obtenga la entrada de la matriz para ese conteo y reemplace el último campo con esa entrada.

Obtengo una salida como:

~ awk 'FNR == NR {baby[NR] = $0; next} /baby/ {count++; $NF = baby[count]} 1'  file2 file1
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D1
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D2
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D3
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D4
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D5
I love watermelon
0
28.01.2020, 02:23

Другой awk

awk -v f='file2' '$3=="baby"{getline $3 <f}1' file1

Каждый раз, когда field3 = baby в файле1, замените $3 строкой файла2.

Редактировать:

Если я правильно понял, ваша строка в файле 1 выглядит так:

Ilovepeaches
Ilovemybeautifulbabygirl
Ilovewatermelon

И вы хотите заменить каждого ребенка строкой из файла2

Итак, вы можете попробовать так:

awk -v search='baby' -v f='file2' '
  $0 ~ search {
     split($0,lign,search)
     getline <f
     $0=lign[1]$0lign[2]
}1' file1

выход:

Ilovepeaches
IlovemybeautifulD3girl
Ilovewatermelon
1
28.01.2020, 02:23

Теги

Похожие вопросы