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]$//'
逐个解释每个规则:
s/^\+\s*//:^\+匹配行开头的加号(正则里+是特殊字符,需要转义成\+);\s*匹配加号后面的所有空白字符(不管是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
相关产品推荐
相关产品推荐

