2010-08-16 6 views
2

J'ai une liste de répertoires à partir de/root. Par exemple,extrait sous-expression avec sed

texte aléatoire/root/dir1/fichiers fin aléatoire

me supprimer/root/dir1/fichiers/2dir Je suis perdre

/root/examples/source alalalala

/root/exemple/en-tête un autre texte

Je veux utiliser sed pour prendre de chaque ligne le répertoire et supprimer tout le reste. Ma sortie finale doit être

/root/dir1/fichiers

/root/dir1/fichiers/2dir

/root/examples/source

/root/exemple/tête

Comment puis-je le faire? (extraire tout à partir de/root ... jusqu'à la fin du chemin)

+0

Avez-vous essayé quelque chose? – cthom06

Répondre

0

ENCORE UNE AUTRE ÉDITION: Il semble que mon évaluation initiale de la question ne l'ait pas vraiment lue aussi étroitement qu'elle aurait dû. Merci pour le commentaire ci-dessous, j'ai appris quelques astuces, et peut éclaircir cette réponse.

Tout d'abord, tylerl a montré une commande qui devrait fonctionner dans sed dans this answer. Bon truc, même si je vais probablement m'en tenir à ça.

Ma propre solution n'a pas pris en compte le premier couple de lignes donné dans la description. ghostdog74 donne une solution qui pourrait fonctionner here.

Jetez un oeil aux solutions liées ci-dessus.

+2

Lorsque vous utilisez awk/nawk, il n'est pas nécessaire d'utiliser sed. 'nawk '/^\/root/{print $ 1}''.Les gens ont souvent la fausse impression que sed et awk travaillent ensemble, alors qu'en fait, awk suffit. – ghostdog74

+1

Sed le fera aussi. Comme le fera perl. Comme le fera bash. Comme python ... etc. Awk n'est pas "ce que vous cherchez", mais plutôt "un autre outil qui fonctionnera". – tylerl

+0

@ ghostdog74 C'est beaucoup plus propre, très bien. @tylerl Je n'étais pas au courant de cette fonctionnalité avec sed. Upvoted votre réponse ci-dessous, car il répond directement à la question du PO. –

1
awk '{for(i=1;i<=NF;i++) if ($i ~/\/root/) {print $i} }' file 
2

Ici, vous allez:

sed 's|^[^/]*\(/[^ ]*\).*$|\1|' 

Cela suppose que les noms de fichiers ne sont pas des espaces en eux, et le premier «/» sur la ligne marque le début d'un nom de fichier.

Révision en:

sed -n 's|^[^/]*\(/[^ ]*\).*$|\1|p' 

aux seules lignes de sortie correspondant au modèle (pas de lignes vides).

+0

@Dennis: fixe. – tylerl

2

Par souci d'exhaustivité gratuit, j'ai également inclus une solution dans quelques autres langues:

Bash

while read LINE; do 
    X=${LINE#*/} 
    X=${X%% *}; 
    [ "$X" == "" ] || echo /$X 
done 

Perl

perl -ne '/(\/root[^ ]+)/ and print "$1\n"' 

Lua

#!lua 
while true do 
    local line = io.read() 
    if line == nil then break end 
    s = string.match(line,"/root[^%s]+") 
    if s then print(s) end 
end