如何使用sed/awk删除文本行DEST括号内的多余前缀
问题原因
你之前执行的sed 's/\(FILE1A\).*/\1/'命令没有生效,核心有两个问题:
- 正则仅匹配包含
FILE1A的行,包含FILE1B的行完全没有命中规则,不会做任何修改 - 就算匹配到
FILE1A的行,也只处理了FILE1A之后的内容,FILE1A前面的DEST(MYFILExxx.等内容没有被匹配到,不会被修改,因此输出和原内容几乎一致
解决方案
方案1:输出理想结果(不带DEST包裹)
执行以下sed命令:
sed -E 's/DEST\(.*\.(FILE1[AB])\)/\1/' 你的文件名
执行后输出:
TREE(abc/x73/APPLE) FILE1A TREE(abc/x74/APPLE) FILE1A TREE(abc/x100/APPLE) FILE1B TREE(abc/x61/APPLE) FILE1A
规则说明:
-E开启扩展正则表达式,减少不必要的转义字符- 正则匹配
DEST(开头、到任意字符加.、再到FILE1A/FILE1B加)的整段内容,将FILE1[AB]捕获为分组,替换时只保留分组内容
方案2:输出可接受结果(保留DEST包裹)
执行以下sed命令:
sed -E 's/(DEST\().*\.(FILE1[AB])\)/\1\2/' 你的文件名
执行后输出:
TREE(abc/x73/APPLE) DEST(FILE1A) TREE(abc/x74/APPLE) DEST(FILE1A) TREE(abc/x100/APPLE) DEST(FILE1B) TREE(abc/x61/APPLE) DEST(FILE1A)
规则说明:
- 额外捕获
DEST(作为第一个分组,替换时保留DEST(加FILE1[AB]加)的结构即可
如果需要直接修改原文件,给sed命令加上-i参数即可(macOS系统需要写成-i '')。
内容的提问来源于stack exchange,提问作者J Fox
相关产品推荐
相关产品推荐

