如何用sed移除字符串流中首个单词的最后一个字符?
解决sed移除首个单词最后一个字符的问题
你的命令问题分析
你原来的sed 's/\(\.\)\([^ ]*\) /\2有几个明显问题:
- 正则里的
\(\.\)是匹配点号,但你的目标字符串20240801T00:48里没有点号,根本匹配不到内容 - 后面的
[^ ]*(带空格)是匹配“非空格字符+空格”,但你的输入是单个无空格字符串,同样匹配不到 - 命令语法不完整,缺少闭合的
/',执行本身就会报错
针对需求的正确命令
分两种场景:
- 场景1:输入只有单个单词(如你的例子
20240801T00:48)
直接匹配行尾的任意字符并删除,命令最简单:
sed 's/.$//'
测试:输入20240801T00:48会输出20240801T00:4
- 场景2:输入有多个单词,只移除首个单词的最后一个字符
比如输入20240801T00:48 hello world,要输出20240801T00:4 hello world,可以用:
sed 's/^\(\S*\)./\1/'
解释:^匹配行首,\S*匹配首个单词的所有非空白字符,\( \)分组保存除最后一个字符外的部分,.匹配首个单词的最后一个字符,替换为分组1的内容就完成了删除。
更简洁的优化写法(GNU sed适用)
如果你的环境是GNU sed(大部分Linux系统默认是),可以用\K语法,更直观:
sed 's/^\S*\K.//'
解释:^\S*匹配首个单词的全部内容,\K表示保留前面匹配的内容,只替换后面的.(首个单词的最后一个字符)为空,效果和上面的命令一致,但写法更简洁。
内容的提问来源于stack exchange,提问作者imac
相关产品推荐
相关产品推荐

