другое решение awk
$ cat ip.txt
[ABC]
value1=bla
value2=bla
value3=bla
[XYZ]
value1=bla
value2=bla
value3=bla
Если строка начинается с [
, назначьте флаг, который будет установлен или сброшен в зависимости от имени блока. Затем, если флаг установлен, выполните замену
$ awk '/^\[/{f=/\[ABC\]/} f{sub("value1=bla","value1=nobla")} 1' ip.txt
[ABC]
value1=nobla
value2=bla
value3=bla
[XYZ]
value1=bla
value2=bla
value3=bla
Аналогичное решение в perl
, замените замену для демонстрации
$ perl -pe '$f=/\[ABC\]/ if /^\[/; s/value2=bla/value2=nobla/ if $f;' ip.txt
[ABC]
value1=bla
value2=nobla
value3=bla
[XYZ]
value1=bla
value2=bla
value3=bla
Если все справа от =
должно быть изменено независимо от В частности, соответствующий bla
, используйте
awk '/^\[/{f=/\[ABC\]/} f{sub(/value1=.*/,"value1=nobla")} 1' ip.txt
perl -pe '$f=/\[ABC\]/ if /^\[/; s/value2=.*/value2=nobla/ if $f;' ip.txt
Попробуйте это. (Не тестировалось.)
destination= # assign
i=0
while read line; do
cp --parents "$line" "$destination"
((i++))
[ $i -eq 100 ] && sleep 600 && i=0
done < outfile.txt
# or: done < <(find ... and so on) # to avoid creating the temp file
Измените "echo cp" на ваш реальный cp
, и следующее должно сделать это. Он будет спать 10 минут после каждых 100 файлов. Предполагается, что ни одно из ваших имен файлов не содержит / не содержит символов новой строки, так что каждая строка в файле outfile.txt соответствует имени файла.
#!/usr/bin/env bash
count=0
while IFS= read -r file
do
echo cp "$file" dest/
count=$((++count))
[[ $(($count % 100)) == 0 ]] && sleep $((10 * 60))
done < outfile.txt