2017-04-21 3 views
-1

J'ai le code suivant sed qui fonctionne dans RH6 et sed 4.2.1Code sed fonctionne en 4.2.1 mais pas 4.1.5

>> echo "SUSE Linux Enterprise Server 11 (x86_64) VERSION = 11 PATCHLEVEL = 2" | sed s/.*VERSION\ =\ // 
11 PATCHLEVEL = 2 
>> sed --version 
GNU sed version 4.2.1 

mais il échoue à SUSE 11 et sed 4.1.5

>> echo "SUSE Linux Enterprise Server 11 (x86_64) VERSION = 11 PATCHLEVEL = 2" | sed s/.*VERSION\ =\ // 
sed: No match. 
>> sed --version 
GNU sed version 4.1.5 

J'ai trouvé que le code suivant fonctionne différemment dans les deux versions. sed 4.1.5 dans SUSE ne correspond à rien.

echo ab | sed s/.*// 

Est-ce un problème connu de sed? et a-t-il une solution?

+1

Vous avez une réponse, mais je suis curieux de connaître votre symptôme: Avez-vous vraiment obtenu 'sed: No match.'? Cela ne ressemble pas à un message d'erreur Sed; était-ce peut-être 'bash: pas de correspondance: s /.* VERSION = //'? Vous obtiendriez cela si 'shopt -s failglob' se trouve être en vigueur, provenant de la tentative échouée de _shell_ de faire correspondre ce modèle avec les fichiers du répertoire actuel. (en raison d'être non cité). – mklement0

Répondre

3

Puisque vous n'avez pas cité l'astérisque, votre shell essaie de le globaliser. Sur un de vos systèmes, cette globalisation échoue et la chaîne d'origine est renvoyée. Sur votre autre système, il correspond à quelque chose et votre regex de substitution est détruit. Toujours citez les arguments que le shell peut considérer comme "spéciaux".

-1

J'ai trouvé sed 4.1.5 a besoin de guillemets simples pour que tout fonctionne. Les travaux suivants.

echo ab | sed 's/.*//' 

Mais le sed 4.2.1 n'en a pas besoin.

+2

Ce n'est pas ça, c'est ça. C'est la coquille. Vous pouvez avoir glob désactivé sur l'ancien système et activé sur le nouveau système. – alvits