Сzsh
:
autoload zmv # best in ~/.zshrc
zmv -n '(file.)i(<->)(.trusted.txt)' '$1A$(($2+30+70*(($2-1)/30+1)))$3'
(удалите -n
или подключитесь к sh
, когда будете счастливы ).
Это будет работать:
mv -- file.i001.trusted.txt file.A101.trusted.txt
mv -- file.i002.trusted.txt file.A102.trusted.txt
[...]
mv -- file.i029.trusted.txt file.A129.trusted.txt
mv -- file.i030.trusted.txt file.A130.trusted.txt
mv -- file.i031.trusted.txt file.A201.trusted.txt
mv -- file.i032.trusted.txt file.A202.trusted.txt
[...]
mv -- file.i059.trusted.txt file.A229.trusted.txt
mv -- file.i060.trusted.txt file.A230.trusted.txt
mv -- file.i061.trusted.txt file.A301.trusted.txt
mv -- file.i062.trusted.txt file.A302.trusted.txt
[...]
mv -- file.i211.trusted.txt file.A801.trusted.txt
mv -- file.i212.trusted.txt file.A802.trusted.txt
Вы можете заменить <->
на <1-60>
, если хотите обработать только первые 60.
Если это не всегда партии по 30 штук, всегда можно запустить несколькоzmvs
:
i=1 j=100
for batch (30 40 30 50) {
zmv -n "(file.)i(<$i-$((i+batch-1))>)(.trusted.txt)" \
'$1A$(($2+j))$3'
((i += batch, j += 100 - batch))
}
Что дает:
mv -- file.i001.trusted.txt file.A101.trusted.txt
[...]
mv -- file.i030.trusted.txt file.A130.trusted.txt
mv -- file.i031.trusted.txt file.A201.trusted.txt
[...]
mv -- file.i070.trusted.txt file.A240.trusted.txt
mv -- file.i071.trusted.txt file.A301.trusted.txt
[...]
mv -- file.i100.trusted.txt file.A330.trusted.txt
mv -- file.i101.trusted.txt file.A401.trusted.txt
[...]
mv -- file.i150.trusted.txt file.A450.trusted.txt
escaped_file_contents=$(<foobar.txt sed 's:[\/&]:\\&:g;$!s/$/\\/')
sed "s/foo/$escaped_file_contents/g"
Помните, однако, что конечные пустые строки в foobar.txt
, если таковые имеются, удаляются.
Подробнее см. аналогичные вопросы и ответы .
Или сperl
:
REPL=$(cat foobar.txt) perl -pe 's/foo/$ENV{REPL}/g'
Или заставить perl
прочитать содержимое foobar.txt
самостоятельно:
perl -pe '
BEGIN {$/ = undef; $repl = <>; $_ = "\n"; chomp $repl}
s/foo/$repl/g' foobar.txt -
С Gnu sed вы можете сделать так, как показано:
$ echo foo | sed -e 's/foo/cat foobar.txt/e'
Следует отметить, что sed работает с полным пространством шаблонов при использовании команды s///e. Также завершающие символы новой строки должны быть обрезаны.
Или с помощью Perl:
$ perl -lpe 's/foo/qx(cat foobar.txt)/e'