在我几年前编写的bash
个干净的脚本中,我有以下sed
个范围替换表达式,它在旧环境中有效(或至少从未出错),但在新环境中失败(有错误),并且我无法确定为什么新旧环境之间的范围无效.
该表达式的目的是从用于将数据导入数据库的TSV文件中删除不需要的Unicode或控制字符.
单行中的表达式示例:
sed -e 's,[\x00\x01-\x08\x0a-\x1f\x7f]\+,,g' file.tsv
- 旧环境:Ubuntu v16.04、Bash v4.3.46、GNU SED v4.2.2
- 新环境:Ubuntu v20.04、Bash v5.0.17、GNU SED v4.7
仅在新环境中出错(在旧环境中没有错误):
/usr/bin/sed: -e expression #1, char 35: Invalid range end
我try 在https://www.jdoodle.com/test-bash-shell-script-online上运行该表达式,并 Select 使用sed v4.7的bashv5.0.011,但没有产生错误,因此可能不是sed或bash的版本问题.
我记不起我是如何组成所用的字符范围的,也记不清为什么有两个范围(两个),但我觉得我知道很多年前就能有效地组成它.现在,在迁移到运行脚本的新的停靠容器环境时,我正在try 记住和诊断这一点.
Questions:个
为什么这在一种环境中会失败,而在另一种环境中不会呢?
有没有可能这个表达式需要的不是sed等版本,而是我在旧环境中所做的设置?如果你对此有什么 idea ,我可以判断和测试.
Note:我实际上不需要特定的内容来测试这一点,我只需运行上面的示例,而不使用‘file.tsv’或空文件,它将在新环境中产生相同的错误.