如何用sed正则提取文件中分号分隔的指定子串
用sed提取并格式化文本的解决方案
原始输入文本
10|subpath ; xxx ; xxx ; xxx ; xxx ; substring ; xxx ; ...... 12|subpath ; xxx ; xxx ; xxx ; xxx ; substring ; xxx ; ...... 18|subpath ; xxx ; xxx ; xxx ; xxx ; ; xxx ; ......
提取需求
- 提取每行第一个分号之前的内容
- 提取每行第五个与第六个分号之间的子串(该子串可能为空,前后可能带空格)
输出格式要求
10|subpath;substring_fs 12|subpath;substring_fs 18|subpath;fs
规则说明
- 如果提取的子串为空,替换为
fs - 如果子串非空,在子串末尾追加
_fs
实现的sed命令
sed -E 's/^([^;]+);.*;.*;.*;.*;\s*([^;]*)\s*;.*/\1;\2_fs/; s/;_fs/;fs/' input.txt
命令解释
-E参数启用扩展正则表达式,减少正则里的转义字符,让命令更简洁- 第一个替换规则:
^([^;]+):匹配并捕获第一个分号之前的所有内容(记为捕获组1);.*;.*;.*;.*;:跳过前四个分号分隔的内容,定位到第五个分号之后\s*([^;]*)\s*:匹配并捕获第五、六个分号之间的子串,同时自动去掉子串前后的空格(记为捕获组2)\1;\2_fs:用捕获组1 + 分号 + 捕获组2 +_fs替换整行内容
- 第二个替换规则:
- 当捕获组2为空时,第一个替换会生成
;_fs,这条规则把它替换成;fs,满足空串填充fs的要求
- 当捕获组2为空时,第一个替换会生成
内容的提问来源于stack exchange,提问作者cctv
相关产品推荐
相关产品推荐

