Bash SED替换文件中的一行

Bash SED替换文件中的一行,bash,sed,Bash,Sed,好的,我使用Bash调用类的synFlood python脚本。我想将用户输入合并到这个文件中,所以我使用了Bash(因为我不允许使用python)。我已经从用户那里调用了我的源和目标IP,并将它们存储起来,然后在python脚本中为整个字符串创建新变量,用sed替换 当前我的命令正在运行并替换字符串。但是当我结束脚本时,我说要替换的字符串仍然是原始字符串 例如: sourcepath="src = $source" #set user source IP to full path for py

好的,我使用Bash调用类的synFlood python脚本。我想将用户输入合并到这个文件中,所以我使用了Bash(因为我不允许使用python)。我已经从用户那里调用了我的源和目标IP,并将它们存储起来,然后在python脚本中为整个字符串创建新变量,用sed替换

当前我的命令正在运行并替换字符串。但是当我结束脚本时,我说要替换的字符串仍然是原始字符串

例如:

sourcepath="src = $source" #set user source IP to full path for python script
targetpath="tgt = $target" #set user target IP to full path for python script

sed -e "s/^src.*/$sourcepath/" #replace the src string with sourcepath variable
sed -e "s/^tgt.*/$targetpath/" #replace the tgt string with targetpath variable

python syn.py
Sed将python文件中的两个字符串替换为用户指定的字符串;正如它在终端窗口中显示的那样(对于测试,最终脚本将隐藏此输出)。但是当我在脚本结束后检查文件时,没有任何更改,默认值仍然存在

sed是否只在脚本运行时更改脚本上下文中的值?如果是这样,当我在后续行中调用python脚本时,它会使用sed更改中的当前值,还是使用python脚本中的默认文件


提前感谢您的帮助和澄清。

该片段显然不是您的原始脚本,因为它不起作用。那些
sed
命令没有可操作的数据(没有标准输入和文件名参数)

假设你有更像这样的东西:

sed -e "s/^src.*/$sourcepath/" syn.py #replace the src string with sourcepath variable
sed -e "s/^tgt.*/$targetpath/" syn.py #replace the tgt string with targetpath variable
那么问题是您实际上并没有更改磁盘上的文件。您只需要让sed读取文件并将更改的内容输出到标准输出


您需要将其重定向到一个文件(与不起作用的文件不同),或者使用
-i
标志告诉
sed
修改文件“就地”。

sed命令不会修改文件。它将它们读入,并在进行修改后将其复制到标准输出,但原始文件保持不变

如果您有GNU版本的
sed
,则可以打开一个标志来启用就地修改:
sed-i.bak s/old/new/filename
将修改文件(在创建备份后),而不只是在标准输出上复制更改

如果您没有GNU版本,仍然可以将输出重定向到文件中并将其复制到适当的位置:

cp -p filename filename.bak
sed -e s/old/new/ filename.bak >filename

sed -e "..." file
您正在执行替换,并且输出将显示在屏幕(stdout)中。这是sed的默认行为

如果你想用新内容更新文件,你需要提及它。为此,您有两个选项:

  • 就地编辑

    sed -i.bak "..." file
    
这将替换该文件并用原始内容创建一个
file.bak
备份文件。选中
mansed
,因为根据发行版的不同,语法可能会有所不同(OSX或GNU)。基本上,在OSX中,如果不想创建备份文件,则需要说
sed-i'
。有关更多详细信息,请参阅

  • 重定向到另一个文件:

    sed "..." file > tmp_file && mv tmp_file file
    

也就是说,不是打印到标准输出,而是打印到一个临时文件,然后重命名为原始文件。

注意,
sed-i
不会创建备份;只有在指定
sed-i[后缀]
时,它才会这样做。在不使用
-i
的情况下测试您的
sed
命令,直到您确定它是正确的…啊,现在这更有意义了。我只是用-I开关尝试了一下,并声明了一个.bak,它成功了,但我在试图让单引号也能正常工作时遇到了几个问题。我没有做大量的越狱,而是换成了\x27,它工作得非常完美。感谢您澄清sed如何打印到标准输出,而不是没有-i开关的文件。如果它解决了您的问题,请“接受”答案,@undecision。。只需单击复选框(在这个问题上以及在您收到有用答案的其他任何一个问题上)。如果有混淆,请道歉,我只是从代码中提取了一个片段,而不是将代码的所有行都张贴在这里。感谢您对其操作方式的澄清,以及提供了两种完成将更改写入文件的任务的方法。我使用了-I开关,因为我认为这会更简单,脚本中的代码也会更少。很高兴读到这一点,@undecisive记住,如果答案对你有效,你可以接受。