好的,所以我使用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脚本中的默认文件?
提前感谢您的帮助和澄清。
答案 0 :(得分:1)
sed
命令不修改文件。它读取它们并将它们复制到标准输出并进行修改,但原始文件不受影响。
如果您拥有sed
的GNU版本,则可以打开以启用就地修改的标志:sed -i.bak s/old/new/ filename
将修改文件(创建备份后)而不是只需使用更改在标准输出上复制。
如果您没有GNU版本,您仍然可以将输出重定向到文件并将其复制到位:
cp -p filename filename.bak
sed -e s/old/new/ filename.bak >filename
答案 1 :(得分:0)
该片段显然不是您原来的脚本,因为它不起作用。那些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
修改文件" in-地方"
答案 2 :(得分:0)
说
sed -e "..." file
您正在执行替换,输出将显示在屏幕上(标准输出)。这是sed
的默认行为。
如果您希望使用新内容更新文件,则需要提及它。为此,您有两种选择:
进行编辑
sed -i.bak "..." file
这将替换文件并使用原始内容创建file.bak
备份文件。检查man sed
,因为根据分布,语法可能会有所不同(OSX或GNU)。基本上,在OSX中,如果您不想创建备份文件,则需要说sed -i ''
。有关详细信息,请参阅In-place edits with sed on OS X。
重定向到另一个文件:
sed "..." file > tmp_file && mv tmp_file file
也就是说,不是打印到stdout,而是打印到临时文件,然后将其重命名为原始文件。