Bash SED替换文件中的一行

时间:2015-07-15 15:04:50

标签: bash sed

好的,所以我使用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脚本中的默认文件?

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

3 个答案:

答案 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,而是打印到临时文件,然后将其重命名为原始文件。