我试图通过 SSH 备份一些文件,但tar我得到了我的主文件夹,而不是我想要的那些。我做了一些进一步的测试,归结为:
ssh root@server /bin/sh -c "cd /boot && ls -l"
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,其中列出了/rootnot中的文件/boot。但是,如果我/bin/sh从终端运行整个命令,它就会正确地cd打印/boot文件。
这里发生了什么事?
我正在寻找一种方法来用具体的值替换模板文件中的占位符字符串,使用常见的 Unix 工具(bash、sed、awk,也许是 perl)。替换在单次通过中完成很重要,也就是说,已经扫描/替换的内容不得考虑用于另一次替换。例如,这两次尝试都失败了:
echo "AB" | awk '{gsub("A","B");gsub("B","A");print}'
>> AA
echo "AB" | sed 's/A/B/g;s/B/A/g'
>> AA
Run Code Online (Sandbox Code Playgroud)
在这种情况下,正确的结果当然是 BA。
一般来说,该解决方案应该等同于从左到右扫描输入以寻找与给定替换字符串之一的最长匹配,并且对于每个匹配,执行替换并从输入中的那个点继续(没有已经读取的输入也不应该考虑进行匹配的替换)。实际上,细节并不重要,只是替换的结果永远不会被完全或部分地考虑用于另一个替换。
注意我只是在寻找正确的通用解决方案。请不要提出对某些输入(输入文件、搜索和替换对)失败的解决方案,尽管它们看起来不太可能。