Linux:将文件中的第一个字符串替换为包含引号和斜杠的其他文件的内容。

时间:2017-05-08 16:45:27

标签: linux sed

我今天花了一整天时间试图寻找合适的解决方案,但我无法做到。我的问题:

我有一个XML文件,其中包含多个相同的标签。 例如:

<TASK INSTANCE /> <WORKFLOWLINK CONDITION=""/> <WORKFLOWLINK CONDITION=""/>

我想在第一个<WORKFLOWLINK之前添加其他XML文件的内容。我遇到的问题是这个文件充满了双引号和斜杠。我试过更换它们并逃脱它们,但无济于事。

我的尝试主要取决于以下内容: sed -e "0,/<WORKFLOWLINK/ /<WORKFLOWLINK/{ r ${filename}" -e "}" ${sourcefile}

如果这还不够清楚,我会得到确切的数据,以便您可以看到。

2 个答案:

答案 0 :(得分:0)

为了sed的乐趣:

sed -e "0,/<WORKFLOWLINK/{/<WORKFLOWLINK/{r ${sourcefile}" -e"}}"

诀窍是在第一个地址范围条件0,/<WORKFLOWLINK/之后启动一个新的“模式/命令”对 不理解两个嵌套模式/地址,在第一个模式之后必须有一个命令。使用另外一对曲线{}可以帮助您。

除了在sed中进行大脑练习外,@ EdMorton建议使用XML处理器。他对MCVE的要求也是合适的。我不得不做一些猜测,看看你想要什么,我希望我猜对了 mcve应至少包括

  • 定义问题的错误消息或问题描述
  • 环境变量的初始化
  • 一些样本输入;不是原始数据

你肯定会早些时候得到一个答案(如果我不满足你的话),现在可能是一个更好的答案。
因此,在您提出下一个问题之前,请选择https://stackoverflow.com/tour

GNU sed版本4.2.1
GNU bash,版本3.1.17(1)-release(i686-pc-msys)

答案 1 :(得分:0)

每个人,

感谢您与我思考,即使我显然违反了一些规则。 我已经找到了一个解决方案,认为它不是那么漂亮,但是对于一次性操作它已经足够了。

我已从单个命令转移到首先检测我想要放置数据的位置的组合: from django.utils.decorators import method_decorator from django.contrib.auth.decorators import user_passes_test class RetestCreate(CreateView): @method_decorator(user_passes_test(lambda u: u.is_superuser)) def dispatch(self, *args, **kwargs): return super().dispatch(*args, **kwargs) 将标记字符串放在所需位置。 在此之后,我将标记替换为我拥有的文件的内容。当我试图在一个语句中完成所有操作时,我设法使各个语句工作,所以我只是单独执行它们。 sed -e "0,/<WORKFLOWLINK/ s/<WORKFLOWLINK/@@MARKER@@\n\t<WORKFLOWLINK'"