我正在尝试编写一个压缩某些文件的脚本。但是,在某些文件中,我需要更新依赖项的路径。
压缩文件的脚本目前看起来像这样;
#!/bin/sh
for APP in "${APPS[@]}"
do
cd app/${APP}
npm install
zip -r ../../test.zip node_modules
zip -uj ../../test.zip src/*.js
cd ../../
zip -uj test.zip app/utils/*.js
done
在src/*.js
中有这样的导入;
const someUtil = require('../../utils/someUtil')
虽然压缩这些文件,但我需要将utils路径从../../utils/
更改为./
,但我不想更改原始文件中的路径。
我能够像这样更新原始文件中的路径;
perl -pi -e 's/..\/..\/utils\//.\//g' src/*.js
我怎样才能修改要压缩的文件?
答案 0 :(得分:1)
我认为您想要压缩已更改的文件内容,但不能自行更改文件。
由于您是通过shell脚本执行此操作,因此使用Perl编写新的,已更改的文件并将其压缩(下面为source/*.js_tmp
)很简单,然后将其删除。
perl -we'while (<>) {
open $fh, ">${ARGV}_tmp" if eof;
print $fh s{../../utils}{/.}gr;
}' source/*.js
<>
operator从所有提交的文件中读取行。当eof检测到文件中的最后一行(或未打开的文件句柄)时,将打开一个新文件,其名称派生自当前$ARGV。正则表达式中的/r
修饰符使s/
运算符返回修改后的字符串,而不是将其更改。
或者,使用Path::Tiny
perl -MPath::Tiny -we'
path("${_}_tmp")->spew( path($_)->slurp =~ s{../../utils}{./}gr ) for @ARGV
' source/*.js
该模块非常方便,值得快速安装。
为简单起见,上面的两个命令都将更改的文件写为source/*.js_tmp
。制作这些临时文件名,以免覆盖任何内容。或者,在shell脚本可以创建的新临时目录中使用原始名称,然后删除。
另一个,也许更简单的方法是创建一个临时目录并在shell脚本中将所有文件复制到它,然后在其上运行您的确切Perl单行程序。然后拉链并将它们移除。
答案 1 :(得分:0)
perl i
选项使perl就地编辑文件,这不是你想要的。我不知道perl,但我知道sed,这个用例类似,而且更轻量级:
mkdir --parents to-be-zipped/src
for f in src/*.js; do
sed -e 's/..\/..\/utils\//.\//g' $f >to-be-zipped/$f
done
然后,要压缩的修改文件将位于名为to-be-zipped
的目录中。如果这不是合适的地方,您可以使用mv
移动它们或将它们输出到其他地方。
或者,只需将整个项目复制到临时文件系统(最好是ramdisk)上的目录,修改那里的文件,压缩它们然后删除临时副本。