SED在MacOS上有两种情况失败:重复次数无效和替换命令中的错误标志

时间:2018-11-21 20:14:37

标签: regex bash macos sed bsd

我正在尝试创建一系列跨平台的SED替代品(Linux和MacOS)。我在MacOS上遇到两个SED命令的两个错误,这些错误在Linux的bash下工作正常。为了使它们在BSD风格的SED中被接受,我需要更改什么?

注意:在下面的每个命令中,$ sed_regex_sym被替换为-r(对于Linux)和-E(对于macOS)。

sed -$sed_regex_sym "/.*[*]/!{/.*[|]{1}/s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]([_|\\\/])\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]/\3/g}"

sed -$sed_regex_sym "/^([[:space:]_|\\\/]{0,$N_HASH_CHARS})[A-Z][[:space:]]/s/([A-Z][[:space:]].{1,${N_STAT_CHARS_TO_KEEP}}).*/$(printf "%${N_STAT_INDENT_CHARS}s" " ")\1/"

对于上述两个命令,我分别收到以下两个错误:

sed: 1: "/.*[*]/!{/.*[|]{1}/s/\x ...": bad flag in substitute command: '}'

sed: 1: "/^([[:space:]_|\\/]{0,  ...": RE error: invalid repetition count(s)

对于后一种替换,我确实尝试了转义 match组的括号,就像我在另一篇文章中看到的那样,但这不能解决无效的重复计数错误。

2018年12月1日更新:我确定了上述问题的根源。顺序相反:

1)后面的替换实际上不是sed问题,而是我脚本中执行wc(word count)以确定N_HASH_CHARS的较早的一行仅在macOS上以前面的空格结尾。修剪空格可以解决上面第二个sed命令的问题

2)上面的第一个sed语句实际上是BSD sed与Linux sed之间的兼容性问题。我在stackoverflow的其他地方发现,使用{}的BSD中的嵌入式功能列表需要内部功能列表以;结尾。
放一个;就在g代表全球替代解决问题之后,并且适用于Linux和macOS

1 个答案:

答案 0 :(得分:0)

从上面的更新中复制了答案。

我确定了上述问题的根源。以相反的顺序: 1)后一个替换实际上不是sed问题,而是我脚本中执行wc(单词计数)以确定N_HASH_CHARS的较早的一行仅在macOS上以前面的空格结尾。修剪空间解决了上面第二条sed命令的问题 2)上面的第一个sed语句实际上是BSD sed与Linux sed之间的兼容性问题。我发现在stackoverflow中的其他地方,使用{}的BSD中的嵌入式函数列表需要内部函数列表以结尾; 放一个;就在g代表全球替代解决问题之后,并且适用于Linux和macOS