使用更改字符串作为通过 bash 插入的模板

使用更改字符串作为通过 bash 插入的模板

我有一个文件需要一些插入。插入取决于文件中的现有字符串,我可以使用相应文件中的关键字来识别这些字符串。插入本身应该遵循某一行,在我的示例中“/这里/" 。我通常不使用 bash 所以我有点无助。

我得到了插入工作的部分,但仅对所有条目以及选择部分不特定:

sed -i -e '/HERE/a HelloWorld' $路径

sed -e 的/.钥匙(。)()/\1/'

当前文件:

hello_world_12353_KEY_HalloWelt_1_2_3()
{

   ...

   /*HERE*/
}

abcdefg_KEY_HalloHaus_8_2_3()
{

    ...

   /*HERE*/
}

期望的结果:

hello_world_12353_KEY_HalloWelt_1_2_3()
{

   ...

   /*HERE*/
   KEY_HalloWelt_1_2_3_Addon()
}

abcdefg_KEY_HalloHaus_8_2_3()
{

   ...

   /*HERE*/
   KEY_HalloHaus_8_2_3_Addon()
 }

答案1

$ sed -e '/.*KEY\(.*\)()/ { h; s//   KEY\1_Addon()/; x; }' -e '/HERE/ G' file
hello_world_12353_KEY_HalloWelt_1_2_3()
{

   ...

   /*HERE*/
   KEY_HalloWelt_1_2_3_Addon()
}

abcdefg_KEY_HalloHaus_8_2_3()
{

    ...

   /*HERE*/
   KEY_HalloHaus_8_2_3_Addon()
}

sed命令包含两个主要表达式:

  1. KEY...something...()第一个在找到匹配的行时触发。然后,它将当前行保存到保留空间中,并用一些预先确定的缩进h替换字符串之前的位,并在括号之前添加该位。这将创建我们稍后要插入的行。然后交换保留空间和编辑缓冲区,以便输出未修改的原始行。KEY_Addonx
  2. 当一行匹配时HERE(您可能希望将其更改为类似或类似的更精确的模式\,/\*HERE\*,),保留空间的当前内容将使用 附加到编辑缓冲区G,并以换行符作为分隔符。

答案2

使用任何 awk:

$ awk '
    { print }
    match($0,/KEY.*\(/) { new=substr($0,RSTART,RLENGTH-1) "_Addon()" }
    sub(/\/\*HERE\*\/.*/,"") { print $0 new }
' file
hello_world_12353_KEY_HalloWelt_1_2_3()
{

   ...

   /*HERE*/
   KEY_HalloWelt_1_2_3_Addon()
}

abcdefg_KEY_HalloHaus_8_2_3()
{

    ...

   /*HERE*/
   KEY_HalloHaus_8_2_3_Addon()
}

上面的代码将打印缩进的换行符,无论字符串/*HERE*/缩进多少个空格+制表符。

相关内容