You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下如何移除首尾特殊字符及多空格并提取目标内容?

解决思路与修正后的命令

首先,咱们先拆解你的需求:要从每行形如+ 304685593 2(加号后多空格、中间目标数字、末尾带1/2/3)的内容里,只保留中间的数字。你之前的sed命令没生效,核心原因是正则表达式没匹配到正确的内容,而且逻辑没抓准需求的核心。

为什么你的原命令无效?

你的命令里:

  • s/+ \{2,\}/ /g 试图把「加号+2个以上空格」换成单个空格,但这只是把多空格缩成一个,并没有去掉开头的加号;
  • 后面的s/\{2,\}1/ /g等规则,是匹配「2个以上空格+1」,但你的末尾是「单个空格+1/2/3」,根本匹配不到,自然无法删除末尾的字符。

方案一:精准匹配的sed命令

针对你的行结构,我们可以用两步替换直接命中需求:

find . -name "*.txt" | xargs sed -i.bak -e 's/^\+\s*//; s/\s*[123]$//'

逐个解释每个规则:

  1. s/^\+\s*//:
    • ^\+ 匹配行开头的加号(正则里+是特殊字符,需要转义成\+);
    • \s* 匹配加号后面的所有空白字符(不管是2个还是更多,包括制表符);
    • 整句的作用是删掉开头的加号和后面的所有空格。
  2. s/\s*[123]$//:
    • \s* 匹配末尾数字前的所有空白字符;
    • [123]$ 匹配行尾的1、2或3;
    • 整句的作用是删掉末尾的空格+数字。

方案二:更简洁的awk方案

因为你的每行结构固定(三个字段:加号、目标数字、末尾数字),awk可以直接按空格分割字段,打印第二个字段即可,自动忽略多空格的问题:

find . -name "*.txt" | xargs awk -i inplace '{print $2}'
  • -i inplace 类似sed的-i,直接修改原文件;
  • {print $2} 打印每行的第二个字段,也就是你要保留的数字。

验证效果

拿你的示例行+ 304685593 2测试:

  • 经过sed或awk处理后,都会得到304685593,完全符合需求。

内容的提问来源于stack exchange,提问作者Saher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 17:02:33