使用sed替换/替换制表符
我需要用一个制表符替换一个斜杠字符,以便使用awk提取目录名使用sed替换/替换制表符,sed,awk,Sed,Awk,我需要用一个制表符替换一个斜杠字符,以便使用awk提取目录名 /path/to/some/USEFUL_INFORMATION/in/some/path 我试着这样做,但它所做的只是在输出的起始处加上一个“t” sed -e 's/\//\t/g' filename 任何帮助都将不胜感激。使用+作为分隔符 sed-e的+/++\t+g' echo 'path/to/something' | sed -e 's+/+\t+g' // path to something 编辑
/path/to/some/USEFUL_INFORMATION/in/some/path
我试着这样做,但它所做的只是在输出的起始处加上一个“t”
sed -e 's/\//\t/g' filename
任何帮助都将不胜感激。使用+作为分隔符
sed-e的+/++\t+g
'
echo 'path/to/something' | sed -e 's+/+\t+g'
// path to something
编辑:
提取文件路径的更简单方法:
dirname /path/to/file.txt
#output /path/to
试试awk:
awk '{gsub("/","\t",$0); print;}' filename
查看
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
首先,您可以使用另一个字符作为分隔符。命令
sed 's:ABC:DEF:g'
相当于
sed 's/ABC/DEF/g'
这将使您的命令更具可读性,因为您不必逃避斜杠
也就是说,一些SED不支持字符转义,例如\t
。例如,在MacOSX中,这种情况经常发生在我身上。我的解决方案是按Control+V,然后按tab char:
sed 's:/:<Control+V><TAB character>:g'
但是,如果要将所有路径目录放入awk变量$1
,$2
等中,只需将斜杠声明为带有awk-F
标志的字段分隔符:
$ pwd
/Users/brandizzi/sandbox/demo/mydemo
$ pwd | awk -F / '{print $3 " " $5}'
brandizzi demo
awk-F'/'{print$5}'您的_文件
这将打印有用的信息
它将字段分隔符定义为/。请注意,由于字符串以/开头,因此第一个字段为空,因此您的字段计数将比您想象的多一个。我找到了答案,对我来说。我有MacOSX,所以我使用了Control+v,后跟Control+I
sed -e 's/\/[CTR+V][CTR+I]/g' filename
首先,按照其他人的建议,使用另一个字符作为分隔符。第二,在引号外使用
$'\t'
。带有的示例代码>作为分隔符:
$ echo "/path/to/some/USEFUL_INFORMATION/in/some/path" | sed -e 's;/;'$'\t'';g'
path to some USEFUL_INFORMATION in some path
试着用双引号(“”)代替单引号(“”),如下面的命令所示
sed-i“s/\/\\t/g”文件名
$ 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
当我们处理特殊字符时,通常使用带sed的双引号(“”)
与您的情况一样,您没有在制表符(\t)中转义\。使用sed替换/为制表符:
sed 's/\//\'$'\t/g' filename.txt
通常,将\'$置于制表符(\t)和换行符(\n)之前。在bash中工作
提取目录名:
就个人而言,我会使用grok12的答案
awk -F'/' '{print $5}' filename.txt
另一种选择是在以下范围内使用:
输出为:
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
这似乎取决于sed
的版本。尝试tr'/'''\t'
并查看会发生什么。您不需要将/
替换为选项卡
,然后将其馈送到awk
awk
可以独立完成。想想看,如何cut-f5-d'/'
?问题是需要和试探性解决方案的混合体。实际的需求似乎是提取有用的信息,但它不能说明之前是否总是有相同数量的斜杠,这就改变了问题。用TAB替换/是暂定解决方案的一部分。。。还是真正的问题?在后一种情况下,有一些相关的问题,如.gsed-e's/\/\t/g'文件名
,因为GNUsed
理解\t
。在Mac上,使用brew安装安装。感谢:提示Mac。同上。这正是我所寻找的。这是在什么*NIX平台上运行的sed的哪个版本?这是这里唯一对我在OS XT上有效的答案。这应该标记为正确的答案(最直接,仅使用sed
)。我也使用^V^I
,但不喜欢在维护的脚本文件中出现某些编辑器可能会弄乱的不可见字符。您也可以使用代替!告诉终端按字面解释字符,而不是运行一个绑定操作(例如,Tab通常会尝试自动完成当前单词,但这允许您直接插入Tab字符)最接近的答案,
path to some USEFUL_INFORMATION in some path