微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

macOS sed - 复杂的替换命令

如何解决macOS sed - 复杂的替换命令

我有一个包含很多行的文本文件,需要使用 macOS sed 进行一些复杂的替换。解释我的问题有点困难,所以我先举个例子:

文件

#00101:A9AA%AAB
#03901:%E+2100009+X3800
#06008:01020304

预期输出

#00101:0000%A00
#03901:%E+2000000+X0000
#06008:01020304

对于以“#xxx01:”开头的所有行(其中 x 代表任何数字),我需要将所有字母数字字符(AZ,0-9)替换为“0”,“:”之前的数字除外,并且任何以“%”或“+”开头的两个字符序列。

我知道基本的替换和异常命令,以及使用“^”在行首搜索模式,但我对如何组合所有这些命令感到困惑。我该怎么做呢?如果在 sed 中无法实现,则欢迎使用非 sed 解决方案。

解决方法

创建一个文件 script.sed,其中包含:

/^#[0-9]{3}01:/ {
    :r
    s/:((0|[+%]..)*)[A-Za-z1-9]/:\10/
    t r
}

调用包含示例输入数据的文件 data。 运行显示的命令以获得所需的输出:

$ sed -E -f script.sed data
#00101:0000%AA0
#03901:%E+0000000+X3000
#06008:01020304
$

选项 -E 告诉 sed 使用扩展的正则表达式。选项 -f 告诉它从文件 script.sed 中读取程序。

模式 /^#[0-9]{3}01:/ 查找以 # 开头,后跟 3 位数字、01 和一个冒号的行。 {} 之间的行为每个匹配行执行。

:r 创建了一个标签 r,可以使用 bt 命令分支到该标签。如果自上一个 t r 命令以来有一个成功的 r 命令,则 s/// 分支到标签 t

s/:((0|[+%]..)*)[A-Za-z1-9]/:\10/ 命令搜索冒号后跟任意序列的 0+..%.. 字符(其中点匹配任何字符),然后后跟0 以外的字母数字字符。它用冒号、记住的匹配项和 0 替换其他字母数字字符。如果不省略 0,则会陷入无限循环。

您也可以使用命令行脚本代替脚本文件,可能带有多个 -e 选项(脚本文件的每一行一个)或一个脚本选项和足够多的分号。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。