Linux 如何在bash转义空白中找到键值对文件?

Linux 如何在bash转义空白中找到键值对文件?,linux,bash,shell,Linux,Bash,Shell,需要设置foo.txt中列出的所有变量,如何通过转义空格字符来获取此文件的源代码?foo.txt来自我无法控制的其他应用程序,或者是否有源代码的替代方案?如果输出非常规则,您可以尝试使用sed对文件进行预处理,如下所示: $ cat foo.txt a=1one b=2two c=3 three d=4four $ source foo.txt bash: three: command not found... $sed-e“s/=/='/;s/$/'/”sourceed.env 然后是s

需要设置
foo.txt
中列出的所有变量,如何通过转义空格字符来获取此文件的源代码?foo.txt来自我无法控制的其他应用程序,或者是否有
源代码
的替代方案?

如果输出非常规则,您可以尝试使用
sed
对文件进行预处理,如下所示:

$ cat foo.txt
a=1one
b=2two
c=3 three
d=4four

$ source foo.txt
bash: three: command not found...
$sed-e“s/=/='/;s/$/'/”sourceed.env

然后是source
sourceed.env
。这将在
=
之后添加一个
,并添加一个结尾

@anubhava,…如果您信任它的话。如果没有,最好显式解析。@anubhava,您建议的sed有命令行选项吗?或者我应该创建一个sed文件并将其作为新文件的来源?@rodee,
sed-I
在适当的位置修改一个文件(理论上,它会创建一个新的临时文件,并将其重命名为原始文件)。如果您有一个不支持它的基线POSIX
sed
,那么是的,您可以省略该选项,将输出重定向到一个文件,并将该文件作为源文件(或者,如果您有一个足够新的bash,这不是bug,
source@anubhava,在您的第一个注释中,
s/*$/“/
,如果我删除此空格,寻源将失败,但我不明白为什么。
*
在regex中是一个修饰符,表示“零或多个先前的内容”,在本例中,表示零个或多个空格。如果没有前面的内容,则为无效语法。如果我们不信任编写文件的程序,则这是一个非常糟糕的主意;如果它包含
foo=$(rm-rf~)'$(rm-rf~)“
,则文件中的文字引号将抵消由
sed添加的引号。我可以信任该文件。Mmm。请确保。在我以前的一位雇主那里,他们相信文件名是安全生成的,直到Python脚本使用的第三方C库中出现缓冲区溢出,该脚本从内存中生成随机内容在名称中添加了y,其中碰巧包含一个空格和星号;一个写得不安全的脚本试图删除该文件,但发生了不好的事情。也就是说,有时会发生奇怪的事情;即使在您认为不需要的时候,也最好编写安全的代码,然后在重要的时候以正确的方式进行操作,这是意料之中的不管怎样。
$ sed -e "s/=/='/;s/$/'/" < foo.txt >sourced.env