我需要用制表符替换斜杠字符,以便使用awk提取目录名称。
/path/to/some/USEFUL_INFORMATION/in/some/path
我尝试过这样做,但它所做的只是在我的输出中加上“t”。
sed -e 's/\//\t/g' filename
任何帮助都将不胜感激。
答案 0 :(得分:31)
首先,您可以使用另一个字符作为s///
分隔符。命令
sed 's:ABC:DEF:g'
等同于
sed 's/ABC/DEF/g'
它将使您的命令更具可读性,因为您不必转义斜杠。
说,有些seds不支持\t
等字符转义。例如,它在Mac OS X中发生在我身上。我的解决方案是按Control + V然后按Tab键:
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
答案 1 :(得分:17)
尝试awk
:
awk '{gsub("/","\t",$0); print;}' filename
答案 2 :(得分:5)
我找到答案,here。我有MacOSX所以我使用Control + v,然后使用Control + i。
sed -e 's/\/[CTR+V][CTR+I]/g' filename
答案 3 :(得分:4)
使用sed替换/使用TAB :
sed 's/\//\'$'\t/g' filename.txt
通常,在tab(\ t)和换行符(\ n)之前放置\'$'。在bash中工作。
提取目录名称:
就个人而言,我会使用grok12的答案。
awk -F'/' '{print $5}' filename.txt
答案 4 :(得分:1)
awk -F'/''{print $ 5}'your_file
这会打印USEFUL_INFORMATION
它将字段分隔符定义为/。请注意,由于您的字符串以/开头,因此第一个字段为空,因此您的字段数将比您想象的多一个。
答案 5 :(得分:1)
尝试将双引号(“”)放在一边而不是单引号(''),如以下命令所示。
sed -i "s/\//\\t/g" filename
通常我们在处理特殊字符时会使用双引号(“”)和 sed 。
在您的情况下,您没有转义TAB字符(\ t)中的 \ 。
答案 6 :(得分:0)
使用+作为分隔符
sed -e 's+/+\t+g
“
echo 'path/to/something' | sed -e 's+/+\t+g'
// path to something
修改强> 提取文件路径的简单方法:
dirname /path/to/file.txt
#output /path/to
答案 7 :(得分:0)
查看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
答案 8 :(得分:0)
首先,如其他人所建议的那样,使用另一个字符作为分隔符。其次,使用引号的$'\t'
。以;
作为分隔符的示例:
$ echo "/path/to/some/USEFUL_INFORMATION/in/some/path" | sed -e 's;/;'$'\t'';g'
path to some USEFUL_INFORMATION in some path
答案 9 :(得分:0)
另一种选择是在`printf "\t"`
中使用sed
:
sh -c 'echo test1 test2 | sed -E "s#(.*) (.*)#\2`printf "\t"`\1#g"'
输出为:
test2 test1
这里显示它适用于您自己的示例:
sh -c 'echo /path/to/some/USEFUL_INFORMATION/in/some/path | sed "s#/#`printf "\t"`#g"'
输出:
path to some USEFUL_INFORMATION in some path