2010-08-12 7 views
1

je sed en cours d'exécution avec l'argument suivant bien si je copier et coller dans une coquille ouverte:Comment passer d'une ligne de commande multiple sed dans la ligne de commande à une seule ligne dans le script

cat test.txt | sed '/[,0-9]\{0,\}[0-9]\{1,\}[acd][0-9]\{1,\}[,0-9]\{0,\}/{N 
s/[,0-9]\{0,\}[0-9]\{1,\}[acd][0-9]\{1,\}[,0-9]\{0,\}\n\-\-\-//}' 

Le problème est que lorsque j'essaie de déplacer ceci dans un script KornShell (ksh), le ksh jette des erreurs à cause de ce que je pense être ce nouveau caractère de ligne. Quelqu'un peut-il me donner un coup de main avec ça? FYI: l'expression régulière est censée être un remplacement de ligne multiple.

Merci!

+1

montrez-nous les messages d'erreur, et le script exact qui les a provoqués (si c'est très grand, coupez-le sur la (les) ligne (s) concernée (s)). – Gilles

+0

... et les données d'entrée. –

+0

Un cas grave d'abus félin! –

Répondre

1

Ce: \{0,\} peut être remplacé par ceci: *

Ce: \{1,\} peut être remplacé par ceci: \+

Il n'est pas nécessaire d'échapper les traits d'union.

Le saut de ligne peut être remplacé par -e (ou par un point-virgule)

Le cat peut être remplacé en utilisant le nom de fichier comme argument pour sed

Résultat:

sed -e '/[,0-9]*[0-9]\+[acd][0-9]\+[,0-9]*/{N' -e 's/[,0-9]*[0-9]\+[acd][0-9]\+[,0-9]*\n---//}' test.txt 

ou

sed '/[,0-9]*[0-9]\+[acd][0-9]\+[,0-9]*/{N;s/[,0-9]*[0-9]\+[acd][0-9]\+[,0-9]*\n---//}' test.txt 

(non testé)

+0

Merci - cela a fonctionné parfaitement! Quelle est la signification du point-virgule là? est-ce que cette partie de sed? – Shane

+0

@Shane: Le point-virgule est un séparateur de commandes utilisé dans 'sed' (et plusieurs autres langues). 'N' est une commande et' s /// 'en est une autre. Vous pourriez faire quelque chose comme cet exemple trivial: 'echo 'ab' | sed 's /./X/; s /./a/2; s/X/b/''pour chaîner plusieurs commandes ensemble (il échange le" a "et le" b ", soit dit en passant - mais c'est probablement mieux:' sed' s/\ (. \) \ (. \)/\ 2 \ 1/''). –

+0

(.) (.) J'aime aussi celui-là! – Shane

0

pouvez-vous essayer de mettre votre regex dans un fichier et appelez sed avec l'option -f?

cat test.txt | sed -f file.sed 
+0

Non, cela n'a pas fonctionné. J'ai les mêmes erreurs. Merci pour la suggestion cependant! – Shane

0

Pouvez-vous essayer de remplacer le caractère de nouvelle ligne avec `echo -e \\ r`

0

Le shell Korn - contrairement au shell C - n'a aucun problème avec les retours à la ligne dans les chaînes. La nouvelle ligne est donc très peu susceptible d'être votre problème. Les mêmes commentaires s'appliquent aux shells Bourne et POSIX, et à Bash. J'ai copié votre exemple et l'ai exécuté sur Linux sous Bash et Korn sans aucun problème.

Si vous utilisez C Shell pour votre travail, êtes-vous sûr d'exécuter 'ksh ./script' et non './script'?

Sinon, il y a un autre problème - une citation déséquilibrée quelque part, peut-être.

Vérifiez les options '-v' et '-n' ainsi que l'option '-x' sur le Korn Shell. Cela peut vous en dire plus sur le problème.