Замена/с помощью TAB с помощью sed
Мне нужно заменить символ косой черты на вкладку, чтобы я мог извлечь имя каталога с помощью awk.
/path/to/some/USEFUL_INFORMATION/in/some/path
Я пробовал это делать, но все, что он делает, помещает "t" из моего вывода.
sed -e 's/\//\t/g' filename
Любая помощь будет оценена.
Ответы
Ответ 1
Во-первых, вы можете использовать другой символ в качестве разделителя s///
. Команда
sed 's:ABC:DEF:g'
эквивалентно для
sed 's/ABC/DEF/g'
Это сделает вашу команду более читаемой, потому что вам не придется скрывать косую черту.
Сказано, что некоторые seds не поддерживают escape-последовательность символов, например \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
Ответ 2
Попробуйте awk
:
awk '{gsub("/","\t",$0); print;}' filename
Ответ 3
Я нашел для меня ответ здесь. У меня MacOSX, поэтому я использовал Control + v, а затем Control + i.
sed -e 's/\/[CTR+V][CTR+I]/g' filename
Ответ 4
Для замены/с помощью TAB с помощью sed:
sed 's/\//\'$'\t/g' filename.txt
Как правило, поместите символы '$' перед символами tab (\ t) и новой строки (\n). Работает в bash.
Чтобы извлечь имя каталога:
Лично я бы использовал grok12.
awk -F'/' '{print $5}' filename.txt
Ответ 5
awk -F '/' '{print $5}' your_file
Это печатает USEFUL_INFORMATION
Он определяет разделитель полей как /. Обратите внимание, что поскольку ваши строки начинаются с //, первое поле имеет значение null, поэтому количество полей вашего поля будет больше, чем вы могли бы подумать.
Ответ 6
Попробуйте добавить двойную кавычку ("") вместо одиночной кавычки (''), как показано в следующей команде.
sed -i "s/\//\\t/g" filename
Обычно мы используем двойные кавычки ("") с sed, когда мы имеем дело со специальными символами.
Как и в вашем случае, вы не избежали символа \ в TAB (\ t).
Ответ 7
Использовать + в качестве разделителей 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
Ответ 8
Посмотрите 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
Ответ 9
Сначала, как и другие, используйте другой символ в качестве разделителя. Во-вторых, используйте $'\t'
вне цитат. Пример с ;
в качестве разделителя:
$ echo "/path/to/some/USEFUL_INFORMATION/in/some/path" | sed -e 's;/;'$'\t'';g'
path to some USEFUL_INFORMATION in some path