0

这就是我在第一个模式之前添加文本的方式,我想在最后一个模式之后添加

FILE_NAME="folder/myfile.c++"
STR_TO_ADD="string that i want to add"
PATTERN="banana"
ed $FILE_NAME 2>NULL 1>NULL<<EOF
/^$PATTERN
-1
a
$STR_TO_ADD
.
wq
EOF

文件

banana
apple
banana
one
two
three

预期产出

banana
apple
banana
string that i want to add
one
two
three
4

2 回答 2

1

转到文件的最后一行并向后搜索模式。

FILE_NAME="folder/myfile.c++"
STR_TO_ADD="string that i want to add"
PATTERN="banana"
ed $FILE_NAME 2>NULL 1>NULL<<EOF
$
?^$PATTERN
a
$STR_TO_ADD
.
wq
EOF

$文件的最后一行。
?^$PATTERN从当前行向后搜索模式。

于 2019-07-08T11:10:20.803 回答
0

user0 的解决方案很接近,但如果最后一个匹配落在文件的最后一行,它将找到前一个。相反,转到第一行并向后搜索:

1
?^$PATTERN
a
$STR_TO_ADD
.

几天前我刚刚在我的@ed1conf帐户上发布了这个,所以它在我的脑海中很新鲜。

此外,如果您尝试在文本之前添加(您已经拥有的示例),如果第一个匹配项位于第一行,它将失败,因为“ -1”在文件开头之前。相反,使用 " i" 命令插入文本而不是附加它:

$
/^$PATTERN
i
$STR_TO_ADD
.

您可能还需要确保“ $STR_TO_ADD”不包含任何包含单个句点的行,否则变量扩展将过早终止i插入(或a附加)。

于 2019-07-08T18:09:08.703 回答