如何解决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
,可以使用 b
或 t
命令分支到该标签。如果自上一个 t r
命令以来有一个成功的 r
命令,则 s///
分支到标签 t
。
s/:((0|[+%]..)*)[A-Za-z1-9]/:\10/
命令搜索冒号后跟任意序列的 0
或 +..
或 %..
字符(其中点匹配任何字符),然后后跟0
以外的字母数字字符。它用冒号、记住的匹配项和 0
替换其他字母数字字符。如果不省略 0
,则会陷入无限循环。
您也可以使用命令行脚本代替脚本文件,可能带有多个 -e
选项(脚本文件的每一行一个)或一个脚本选项和足够多的分号。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。