Примечание : ниже это для GNU awk
Итак, вы хотите заменить временную шкалу субтитров, верно?
Учитывая, что они индексируются индексируются, т.е.числа над временным кодом совпадают.
Тогда вы можете попробовать это:
awk 'ARGIND==1 && /^[0-9]+$/{getline timeline; tl[$0]=timeline;}ARGIND==2 &&/^[0-9]+$/{getline tmp2drop; print $0 ORS tl[$0];} ' file1 file2
Обратите внимание, что /^[0-9]+$/
- это критерий, который соответствует целой строке только числом.
Ноесли у вас такой текст субтитров существует, то это приведет к ошибке замены.
Другой способ - использовать номер строки (обозначается FNR
) в качестве индекса:
awk 'ARGIND==1 && /-->/{tl[FNR]=$0} ARGIND==2 {if (/->/) print tl[FNR]; else print $0} ' file1 file2
Но еслиномер строки между двумя файлами не совпадает, например, некоторые тексты субтитров являются многострочными, они все равно будут заменены неправильно.
Учитывая вхождения в относительно одинаковых местах, мы можем самостоятельно управлять индексом:
awk 'ARGIND==1 && /-->/{tl[i++]=$0} ARGIND==2 {if (/->/) print tl[j++]; else print $0} ' file1 file2
Ничто из этого не идеально, но чтобы дать вам представление о том, как вы могли бы сделатьвещь.
Выбор зависит от вашей ситуации, и улучшите код самостоятельно:)
примечание: они просто выводятся на консоль, если вы хотите заменить файл.вы можете использовать >
или '>> `, чтобы напечатать вывод во временный файл, а затем переименовать в file2.
Например:
awk 'ARGIND==1 && /-->/{tl[i++]=$0} ARGIND==2 {if (/->/) print tl[j++]; else print $0} ' file1 file2 >> tmpFile2check
Если вы не используете GNU awk, ARGIND==1
не будет работать, затем используйте это:
awk 'NR==FNR && /-->/{tl[i++]=$0} NR>FNR {if (/->/) print tl[j++]; else print $0} ' file1 file2 >> tmpFile2check
NR
означает количество записей, FNR
означает количество записей текущего файла.Если они равны, то это первый файл, с которым имеет дело скрипт.Если NR>FNR
означает, что это не первый файл.
Примечание , если файл1 пуст или может быть пустым, этот механизм не будет работать, тогда вам следует перейти на FILENAME=="file1"
или другой метод проверки файлов, чтобы избежатьобработка ошибок.