'sed' 命令在 PBS 脚本中不能正常工作

'sed' command does not work normally in PBS scripts

我使用torque提交下图所示的测试脚本

#!/bin/bash
#PBS -N test
#PBS -l nodes=1:ppn=1
#PBS -q ser
#PBS -V
#PBS -S /bin/bash

sed 's/a//' <<< aaabbbaaa
sed 's/\(a\)//' <<< aaabbbaaa
sed 's/a\+//' <<< aaabbbaaa

预期输出应该是

aabbbaaa
aabbbaaa
bbbaaa

但实际上当我使用 qsub 提交这个文件时,输出变成了

aabbbaaa
aaabbbaaa
aaabbbaaa

最后两个命令不起作用。而且似乎是字符'\'导致了错误。但是为什么会这样。

服务器上的 sed 实现可能与本地的语法不同。

没有关于远程系统的详细信息,这只是推测;但查找手册页并搜索启用扩展正则表达式语法的选项(通常是 -E-r;如果可用,那么可能会在正则表达式特殊符号之前丢失反斜杠)。

作为一个部分且明显的解决方法,aa* 等同于 a\+ 但不存在用于分组的类似解决方法。

也许还可以阅读 differences between POSIX Basic Regular Expression syntax (BRE) and ERE;尽管您的 PBS 系统可能正在使用甚至早于 POSIX 的东西,如果它是遗留的 big iron。

如果您想编写可在 Linux、MacOS 和 PBS 系统上的任何庞然大物恐龙 OS 之间移植的代码,也许尝试使用 Perl 而不是 sed。即使您只能依赖 Perl 4.x 构造,与试图弄清楚如何编写可移植的 sed 脚本相比,这是一个更加统一(也更加通用)的平台。

perl -pe 's/(a+)//'