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