Замена / на TAB с использованием sed - PullRequest
24 голосов
/ 15 июня 2011

Мне нужно заменить символ косой черты на вкладку, чтобы я мог извлечь имя каталога, используя awk.

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

Я пытался сделать это, но все, что он делает, это помещает "t" вмоего вывода.

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

Любая помощь будет оценена.

Ответы [ 9 ]

31 голосов
/ 16 июня 2011

Во-первых, вы можете использовать другой символ в качестве разделителя s///.Команда

sed 's:ABC:DEF:g'

эквивалентна для

sed 's/ABC/DEF/g'

. Она сделает вашу команду более читабельной, потому что вам не придется избегать косой черты.

Сказал, чтонекоторые seds не поддерживают экранирование символов, например \t.Это часто случается со мной в Mac OS X, например.Мое решение состоит в том, чтобы нажать Control + V, а затем вкладку char:

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

Результат на моей машине:

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

Однако, если вы хотите поместить все каталоги путейв переменных awk $1, $2 и т. д. просто объявите косую черту как разделитель полей с флагом awk -F:

$ pwd
/Users/brandizzi/sandbox/demo/mydemo
$ pwd | awk -F / '{print $3 " " $5}'
brandizzi demo
17 голосов
/ 15 июня 2011

Попробуйте awk:

awk  '{gsub("/","\t",$0); print;}' filename
5 голосов
/ 16 июля 2013

Я нашел ответ, для меня здесь .У меня есть MacOSX, поэтому я использовал Control + v, а затем Control + i.

sed -e 's/\/[CTR+V][CTR+I]/g' filename
4 голосов
/ 26 октября 2016

Для замены / на TAB используется sed :

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

Как правило, ставьте \ '$' перед символами табуляции (\ t) и новой строки (\ n). Работает в Bash.

Чтобы извлечь имя каталога:

Лично я бы использовал ответ grok12.

awk -F'/' '{print $5}' filename.txt
1 голос
/ 05 августа 2016

Попробуйте поместить двойные кавычки ("") вместо одинарных кавычек (''), как показано в следующей команде.

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

Обычно мы используем двойные кавычки ("") с sed , когда мы имеем дело со специальными символами.

Как и в вашем случае, вы не избежали \ в символе TAB (\ t).

1 голос
/ 17 июня 2011

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

Это печатает USEFUL_INFORMATION

Определяет разделитель полей как /. Обратите внимание, что поскольку ваши строки начинаются с /, первое поле равно нулю, поэтому число ваших полей будет на единицу больше, чем вы думаете.

0 голосов
/ 26 августа 2015

Сначала, как предложили другие, используйте другой символ в качестве разделителя. Во-вторых, используйте $'\t' вне кавычек. Пример с ; в качестве разделителя:

$ echo "/path/to/some/USEFUL_INFORMATION/in/some/path" | sed -e 's;/;'$'\t'';g'
path    to  some    USEFUL_INFORMATION  in  some    path
0 голосов
/ 16 июня 2011

Посмотрите на dirname и 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 может работать с любым разделителем, например, /:

$ echo /path/to/some/USEFUL_INFORMATION/in/some/path | awk -F"/" '{print $5}'
USEFUL_INFORMATION
0 голосов
/ 15 июня 2011

Использовать + в качестве разделителей sed -e 's+/+\t+g

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

// path     to     something

Edit: более простой способ извлечь путь к файлу:

dirname /path/to/file.txt
#output /path/to
...