![如何通过 UNIX 替换 tar 文件中存在的文件字符串](https://linux22.com/image/61826/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%20UNIX%20%E6%9B%BF%E6%8D%A2%20tar%20%E6%96%87%E4%BB%B6%E4%B8%AD%E5%AD%98%E5%9C%A8%E7%9A%84%E6%96%87%E4%BB%B6%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我有一个 tar 存档 xyz.tar,其中包含许多 .sh 文件,例如:
123.sh
456.sh
789.sh
每个.sh
文件都有一些字符串内容,例如123.sh
包含欢迎来到好莱坞,456.sh
包含我爱好莱坞,并789.sh
包含好莱坞电影。
.sh
现在,我的目标是使用循环在所有文件中用 Oscar 替换字符串 Hollywood 。
我尝试了这个命令:
for i in $(tar -xvf xyz.tar); do sed -e 's/Hollywood/Oscar/' $i; done
我在命令窗口上得到输出,但 o/p 没有反映在 xyz.tar 存档中,因为在提取和替换命令后无法重新压缩 tar 存档。
答案1
首先,您应该意识到 .tar 文件通常不会被压缩(如果它被压缩.tar.gz
,则更可能有一个扩展名.tar.xz
)。
然后你tar -xvf xyz.tar
提取文件和列出名称,sed 适用于文件名列表,甚至不适用文件内容。
如果您的替换长度与原始文件完全相同,那么理论上您可以(因为 tar 文件没有校验和)替换.tar
.然而更好的方法是首先提取临时目录中的所有文件,然后使用
find . -name "*.sh" -print0 | xargs -0 sed -i -e 's/Hollywood/Oscar/'
然后从该临时目录重新创建 tar 文件。
这假设您sed
支持-i
(用编辑的内容替换输入文件),如果不支持,您应该制作一个小脚本来调用并将输出写入临时文件,然后在完成sed
时将文件复制回来。sed