Использование файла с новой строкой в ​​качестве входных данных для замены sed

С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
0
28.10.2019, 16:04
2 ответа
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 -
1
28.01.2020, 02:39

С 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' 
0
28.01.2020, 02:39

Теги

Похожие вопросы