Grep 并粘贴到同一个文件中

Grep and paste in the same file

我有一个这样的文件。我需要将一个特定的标签复制到另一个标签中,并且对于存在该标签的每个部分。

<Idcode>123456</Idcode>
<DrctDbtTxInf>
  <InstrId>XXX</InstrId>
  <EndToEndId>XXX</EndToEndId>
  <InstdAmt Ccy="EUR">XXX</InstdAmt>
  <MndtId>XXX</MndtId>
  <DtOfSgntr>XXX</DtOfSgntr>
  <AmdmntInd>XXX</AmdmntInd>
  <Nm>XXX</Nm>
  <IBAN>XXX</IBAN>
  <Ustrd>XXX</Ustrd>
</DrctDbtTxInf>
<DrctDbtTxInf>
  <InstrId>XXX</InstrId>
  <EndToEndId>XXX</EndToEndId>
  <InstdAmt Ccy="EUR">XXX</InstdAmt>
  <MndtId>XXX</MndtId>
  <DtOfSgntr>XXX</DtOfSgntr>
  <AmdmntInd>XXX</AmdmntInd>
  <Nm>XXX</Nm>
  <IBAN>XXX</IBAN>
  <Ustrd>XXX</Ustrd>
</DrctDbtTxInf>

我会得到这样的结果:

<Idcode>123456</Idcode>
<DrctDbtTxInf>
  <Idcode>123456</Idcode>
  <InstrId>XXX</InstrId>
  <EndToEndId>XXX</EndToEndId>
  <InstdAmt Ccy="EUR">XXX</InstdAmt>
  <MndtId>XXX</MndtId>
  <DtOfSgntr>XXX</DtOfSgntr>
  <AmdmntInd>XXX</AmdmntInd>
  <Nm>XXX</Nm>
  <IBAN>XXX</IBAN>
  <Ustrd>XXX</Ustrd>
</DrctDbtTxInf>
<DrctDbtTxInf>
  <Idcode>123456</Idcode>
  <InstrId>XXX</InstrId>
  <EndToEndId>XXX</EndToEndId>
  <InstdAmt Ccy="EUR">XXX</InstdAmt>
  <MndtId>XXX</MndtId>
  <DtOfSgntr>XXX</DtOfSgntr>
  <AmdmntInd>XXX</AmdmntInd>
  <Nm>XXX</Nm>
  <IBAN>XXX</IBAN>
  <Ustrd>XXX</Ustrd>
</DrctDbtTxInf>

考虑到我的 bash 版本的限制:4.4.23(1)-release.

感谢您的帮助!

我尝试搜索这样的主题,但搜索起来也很复杂

如果我理解任务:

  1. grep 没有多大帮助,你会发现 IdcodeDrctDbtTxInf 行,但是你很卡住

  2. 粘贴 根本没有帮助(我认为)。粘贴用于合并整个文件

  3. 我认为你可以只使用 sed 成功,但那是有悖常理的

  4. 我相信使用大多数 shell 的 shell 脚本会起作用,而且不会那么困难(如果您正在编写 shell 脚本)

  5. 这是一个使用 gawk (awk) 的单行代码,可能比 shell 等效代码短:

    gawk '{print}/**/{sub(/**/,"");I=$0}//{print I}' < ourInputFile

  • 阅读下一行并打印它
  • 如果该行匹配 **,则去掉星号并命名结果 I
  • 如果该行匹配 ,则打印 I