我正在尝试做这样的事情:
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