Поскольку это объяснение слишком длинное для комментария, добавьте ответ здесь. Я не уверен, был ли мой предыдущий ответ ясным или нет, но мой ответ позаботится об этом случае и заменит только только точные имена файлов, а НЕ смесь имен файлов.
Допустим, ниже приведены значения массива и Input_file:
names=(file1.txt file2.txt file3file2.txt)
echo "${names[*]}"
file1.txt file2.txt file3file2.txt
cat file1
TEXT
\connect{file1}
\begin{file2}
\connect{file3}
TEXT
75
Теперь, когда мы запустим следующий код:
awk -v arr="${names[*]}" '
BEGIN{
FS=OFS="{"
num=split(arr,array," ")
for(i=1;i<=num;i++){
sub(/\.txt/,"",array[i])
array1[array[i]"}"]
}
}
$2 in array1{
$2="a-"$2
}
1
' file1
Вывод будет следующим. Вы могли видеть, что file3 НЕ заменен, так как он НЕ присутствовал в значении массива.
TEXT
\connect{a-file1}
\begin{a-file2}
\connect{file3}
TEXT
75