web-dev-qa-db-fra.com

Remplacement / avec TAB à l'aide de sed

Je dois remplacer un caractère barre oblique par un onglet pour pouvoir extraire un nom de répertoire en utilisant awk.

/path/to/some/USEFUL_INFORMATION/in/some/path

J'ai essayé de le faire, mais tout ce qu'il fait est de mettre un "t" à la sortie de ma sortie.

sed -e 's/\//\t/g' filename

Toute aide serait appréciée.

25
Lance Übercut

Tout d'abord, vous pouvez utiliser un autre caractère comme s/// délimiteur. La commande

sed 's:ABC:DEF:g'

est équivalent à

sed 's/ABC/DEF/g'

Cela rendra votre commande plus lisible car vous n'aurez pas à échapper à la barre oblique.

Dit que, certains seds ne prennent pas en charge les caractères d'échappement tels que \t. Cela m'arrive beaucoup sous Mac OS X, par exemple. Ma solution est d'appuyer sur Ctrl + V puis sur l'onglet char:

sed 's:/:<Control+V><TAB character>:g'

Le résultat dans ma machine est:

$ pwd
/Users/brandizzi/sandbox/demo/mydemo
$ pwd | sed 's:/:        :g'
    Users   brandizzi   sandbox demo    mydemo

Cependant, si votre intention est de mettre tous les répertoires de chemin dans des variables awk $1, $2 etc. déclarez simplement la barre oblique comme séparateur de champ avec awk -F drapeau:

$ pwd
/Users/brandizzi/sandbox/demo/mydemo
$ pwd | awk -F / '{print $3 " " $5}'
brandizzi demo
32
brandizzi

Essayez awk:

awk  '{gsub("/","\t",$0); print;}' filename
17
ssapkota

J'ai trouvé la réponse, pour moi, ici . J'ai MacOSX, j'ai donc utilisé Control + v suivi de Control + i.

sed -e 's/\/[CTR+V][CTR+I]/g' filename
5
Climbs_lika_Spyder

Pour remplacer/par TAB en utilisant sed:

sed 's/\//\'$'\t/g' filename.txt

En règle générale, placez\'$' avant les caractères de tabulation (\ t) et de nouvelle ligne (\ n). Fonctionne en bash.

Pour extraire le nom du répertoire:

Personnellement, j'utiliserais la réponse de grok12.

awk -F'/' '{print $5}' filename.txt
4
quietjen

awk -F '/' '{print $ 5}' votre_fichier

Ceci imprime USEFUL_INFORMATION

Il définit le séparateur de champ comme étant /. Notez que puisque vos chaînes commencent par un/le premier champ est nul, le nombre de champs sera donc un de plus que vous ne le pensez.

1
grok12

Essayez de mettre des guillemets doubles ("") au lieu de guillemets simples ('') comme indiqué dans la commande suivante.

sed -i "s/\//\\t/g" filename

Généralement, nous utilisons des guillemets doubles ("") avec le sed lorsque nous avons affaire aux caractères spéciaux.

Comme dans votre cas, vous n'avez pas échappé au caractère \ TAB (\ t).

1
Ajit K'sagar

Une autre option consiste à utiliser `printf "\t"` dans sed :

sh -c 'echo test1 test2 | sed -E "s#(.*) (.*)#\2`printf "\t"`\1#g"'

La sortie est:

test2   test1

Voici pour montrer que cela fonctionne pour votre propre exemple:

sh -c 'echo /path/to/some/USEFUL_INFORMATION/in/some/path | sed "s#/#`printf "\t"`#g"'

Production:

path    to  some    USEFUL_INFORMATION  in  some    path
0
cnst

D'abord comme les autres l'ont suggéré, utilisez un autre caractère comme délimiteur. Deuxièmement, utilisez $'\t'extérieur des guillemets. Exemple avec ; comme délimiteur:

$ echo "/path/to/some/USEFUL_INFORMATION/in/some/path" | sed -e 's;/;'$'\t'';g'
path    to  some    USEFUL_INFORMATION  in  some    path
0
woodengod

Jetez un œil à dirnameet basename

$ dirname /path/to/some/USEFUL_INFORMATION/in/some/path
/path/to/some/USEFUL_INFORMATION/in/some

$ basename /path/to/some/USEFUL_INFORMATION/in/some/path
path

awk peut gérer n'importe quel séparateur, par ex. /:

$ echo /path/to/some/USEFUL_INFORMATION/in/some/path | awk -F"/" '{print $5}'
USEFUL_INFORMATION
0
Fredrik Pihl

Utilisez + comme délimiteurs sed -e 's+/+\t+g '

echo 'path/to/something' | sed -e 's+/+\t+g'

// path     to     something

Edit: un moyen plus simple d'extraire le chemin d'un fichier:

dirname /path/to/file.txt
#output /path/to
0
Eric Fortis