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.
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
Essayez awk
:
awk '{gsub("/","\t",$0); print;}' filename
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
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
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.
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).
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
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
Jetez un œil à dirname
et 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
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