2010-10-04 8 views
0

je tente de remplacer le charbon # avec une nouvelle ligne \n:unix commande sed pour les caractères échappées

sed -e "s/#/\n/g" > file.txt 

cela fonctionne très bien.

Maintenant, il y a un problème avec l'omble chevalier #, quand est échappé avec -:

par exemple .: 123 # 456- # 789 # 777 devrait être:
456 # 789

CHAR échappé - lui-même peut aussi être échappées: par exemple .: 123 # 456- # 777 # 789 à -012 devrait être:
456 # 789-012

Comment puis-je faire avec sed?

Répondre

1
$ echo "123#456-#789#777" | sed 's/\([^-]\)#/\1\n/g;s/-\(.\)/\1/g' 
123 
456#789 
777 

$ echo "123#456-#789--012#777" | sed 's/\([^-]\)#/\1\n/g;s/-\(.\)/\1/g' 
123 
456#789-012 
777 

$ echo "#123#456-#789#777" | sed 's/\(^\|[^-]\)#/\1\n/g;s/-\(.\)/\1/g' 

123 
456#789 
777 

$ echo "#1###2-#3--4#5#" | sed "s/\([^-]\)##/\1#\n/g;s/\(^\|[^-]\)#/\1\n/g;s/-\(.\)/\1/g" 

1 


2#3-4 
5 

$ 

première partie est de préserver -<any chars> et convertir # (sans précédent -) newline, deuxième partie est de convertir -<any chars> seulement <any chars> (Si vous n'avez pas besoin d'un tel caractère générique, je pense que vous savez comment . modifier seulement - et #)

+0

qu'en est-il de l'écho "# 123 # 456- # 789 # 777" | sed 's/\\ ([^ -] \\) #/\ 1 \ n/g; s/- \\ (. \\)/\ 1/g' – gert

+0

@newGuest, attendez-vous une nouvelle ligne avant ' 123 '? Alors sed/s \\ (^ \ | [^ -] \\) #/\ 1 \ n/g; s/- \\ (. \\)/\ 1/g 'est ce que vous voulez. – livibetter

+0

la nouvelle ligne peut être là - mais cela ne fonctionne pas: echo "1 ## 2 # 3" | sed "s/\\ (^ \ | [^ -] \\) #/\ 1 \ n/g; s/- \\ (. \\)/\ 1/g" – gert

0

sed -e « s/([^ -]) #/\ 1 \ n/g; s/-/-/g de; s/- #/#/g "

Cela échappe seulement - et - # bien.

0
$ echo "123#456-#789--012#777" | awk -F"#" '{print $1;for(i=2;i<NF-1;i++){printf "%s#",$i};print $(NF-1);print $NF}' 
123 
456-#789--012 
777 
$ echo "123#456-#789#777" | awk -F"#" '{print $1;for(i=2;i<NF-1;i++){printf "%s#",$i};print $(NF-1);print $NF}' 
123 
456-#789 
777 
Questions connexes