当且仅当后缀不存在时才向某些文本行添加后缀

当且仅当后缀不存在时才向某些文本行添加后缀

我正在尝试做这样的事情:

sed -i.bak '/^startswith/ s/$/endswith/' /path/to/file

仅有的对于这样做的线路不是已经以字符串“endswith”结尾。

换句话说,我想找到以某些文本开头并且确实的行不是以其他文本结尾,然后在该行末尾附加我想要的文本。

我目前指的是仅当另一个子字符串不存在时才搜索并替换子字符串sed手册页,但我不确定我是否走在正确的轨道上。

答案1

以下方法有效:

sed -i.bak '/endswith/b; /^startswith/ s/$/endswith/' /path/to/file

但是,我不确定这是否是最有效的解决方案。

答案2

如果我理解正确的话:

sed '/^startswith/s/endswith$//; /^startswith/s/$/endswith/' /path/to/file

从左到右:
/^startswith- 查找以以下内容开头的所有行'以。。开始',
s/endswith$//- 基本上删除尾随/后缀'以。。结束',
/^startswith- 再次找到我所有以以下开头的行'以。。开始',
s/$/endswith/- 此时所有'^开头'行末尾没有“endswith”,因此只需添加它即可。

答案3

只需使用 awk:

awk '/^startswith/{ sub(/(endswith)?$/,"endswith") } 1' /path/to/file

答案4

使用 Raku(以前称为 Perl_6)

raku -pe 's/ (^^ header \s .* $$) /$0 trailer/ unless /trailer $$/;'  

输入示例:

header 0123456789
header 0123456789 trailer
none   0123456789 trailer
none   0123456789

示例输出:

header 0123456789 trailer
header 0123456789 trailer
none   0123456789 trailer
none   0123456789

https://docs.raku.org/syntax/s$SOLIDUS$SOLIDUS$SOLIDUS
https://raku.org

相关内容