我有一个文件需要一些插入。插入取决于文件中的现有字符串,我可以使用相应文件中的关键字来识别这些字符串。插入本身应该遵循某一行,在我的示例中“/这里/" 。我通常不使用 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
命令包含两个主要表达式:
KEY...something...()
第一个在找到匹配的行时触发。然后,它将当前行保存到保留空间中,并用一些预先确定的缩进h
替换字符串之前的位,并在括号之前添加该位。这将创建我们稍后要插入的行。然后交换保留空间和编辑缓冲区,以便输出未修改的原始行。KEY
_Addon
x
- 当一行匹配时
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*/
缩进多少个空格+制表符。