2017-12-04 7 views
2

I Drehmoment verwenden, um den Testskript gezeigt Schlag‚sed‘ Befehl funktioniert nicht normalerweise in Skripten PBS

#!/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 

Der erwarten Ausgang

aabbbaaa 
aabbbaaa 
bbbaaa 

sein sollte einreichen aber eigentlich, wenn ich qsub verwenden, um Übergeben Sie diese Datei, die Ausgabe wird

aabbbaaa 
aaabbbaaa 
aaabbbaaa 

Die letzten beiden Befehle funktionieren nicht. Und es scheint, dass das Zeichen '\' zum Fehler führt. Aber warum passiert das?

Antwort

2

Die sed Implementierung auf dem Server hat wahrscheinlich eine andere Syntax als das, was Sie lokal haben.

Ohne Details über das Remote-System ist dies leicht spekulativ; Suchen Sie jedoch nach der Manpage und suchen Sie nach einer Option, um die Extended Regular Expression-Syntax zu aktivieren (normalerweise -E oder -r; falls verfügbar, verlieren Sie wahrscheinlich den Backslash vor den Regex-Specials).

Als eine teilweise und offensichtliche Problemumgehung entspricht aa*a\+ aber keine ähnliche Problemumgehung für die Gruppierung vorhanden ist.

Vielleicht auch auf der differences between POSIX Basic Regular Expression syntax (BRE) and ERE nachlesen; obwohl Chancen Ihr PBS-System ist etwas, das sogar vor POSIX, wenn es Legacy großen Eisen ist.

Wenn Sie Code schreiben wollen, der zwischen Linux, MacOS und was auch immer Behemoth Dinosaurier OS, das Sie auf dem PBS-System haben, tragbar ist, versuchen Sie vielleicht Perl anstelle von sed. Selbst wenn Sie sich nur auf Perl 4.x-Konstrukte verlassen können, ist das eine Plattform, die viel einheitlicher (und viel vielseitiger) ist, als zu versuchen, herauszufinden, wie man portable sed Skripte schreibt.

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

Perl 5 wurde 1994 veröffentlicht. Gut für Sie, wenn Sie das verwenden können. – tripleee