Редактировать:
После просмотра того, что вы хотите получить намного ближе, я пришел к этому
for i in $(sed 's/^/*/;s|ltd/|&**|;s|_|**&|;s/$/*/' File2.txt); do awk -i inplace -v i="$i" 'NR==1,/.*social.*/{sub(/.*social.*/, i)} 1' File1.json; done
Как только вы ограничите замену в File1.json только первым вхождением, которое вы можетепозвольте циклу работать на вас.
Чтобы сломать его
# Instead of cat file I tackled substitution for each line in File2.txt as $i
for i in $(sed 's/^/*/;s|ltd/|&**|;s|_|**&|;s/$/*/' File2.txt); do
# Here awk sub only first occurrence to not overwrite whole file
# Second loop will handle the next occurrence with second line from File2.txt
# And third ect.. ect..
awk -i inplace -v i="$i" 'NR==1,/.*social.*/{sub(/.*social.*/, i)} 1' File1.json
done
Все ниже, если ваша версия awk не поддерживает -i на месте, то вам придется сделать это
awk -v i="$i" 'NR==1,/.*social.*/{sub(/.*social.*/, i)} 1 { rec = rec $0 RS } END { close(FILENAME); printf "%s", rec > FILENAME }' File1.json
Таким образом, все будет выглядеть так:
# Instead of cat file I tackled substitution for each line in File2.txt as $i
for i in $(sed 's/^/*/;s|ltd/|&**|;s|_|**&|;s/$/*/' File2.txt); do
# Here awk sub only first occurrence to not overwrite whole file
# Second loop will handle the next occurrence with second line from File2.txt
# And third ect.. ect..
awk -v i="$i" 'NR==1,/.*social.*/{sub(/.*social.*/, i)} 1 { rec = rec $0 RS } END { close(FILENAME); printf "%s", rec > FILENAME }' File1.json
done
Наконец, если ни одна из вышеперечисленных команд awk не работает, вы можете получить временные файлы.
awk -v i="$i" 'NR==1,/.*social.*/{sub(/.*social.*/, i)} 1' File1.json > tmpfile && mv tmpfile File1.json
, поэтомувсе это будет выглядеть так
for i in `cat File2.txt`; do
awk -v i="$i" 'NR==1,/.*social.*/{sub(/.*social.*/, i)} 1' File1.json > tmpfile && mv tmpfile File1.json
done