在bashshell中操作输出字符串
我写了一行代码,查找并返回所需文件的完整路径。结果如下:在bashshell中操作输出字符串,bash,shell,unix,Bash,Shell,Unix,我写了一行代码,查找并返回所需文件的完整路径。结果如下: /home/ke/Desktop/b/o/r/files.txt:am.torrent /home/ke/Desktop/y/u/n/u/s/files.txt:asd.torrent 我必须修改输出,如下所示: bor yunus $ awk -f script.awk input bor yunus 我该怎么做 提前感谢。这应该适合您: your_script.sh | sed 's,.*Desktop,,' | sed 's,
/home/ke/Desktop/b/o/r/files.txt:am.torrent
/home/ke/Desktop/y/u/n/u/s/files.txt:asd.torrent
我必须修改输出,如下所示:
bor
yunus
$ awk -f script.awk input
bor
yunus
我该怎么做
提前感谢。这应该适合您:
your_script.sh | sed 's,.*Desktop,,' | sed 's,[^/]*$,,' | sed s,/,,g
或者,更好的是:
your_script.sh | sed 's,.*Desktop,,;s,[^/]*$,,;s,/,,g'
和塞德
echo'/home/ke/Desktop/b/o/r/files.txt:am.torrent'| sed-e's++/++g'-e's/^.*Desktop/'-e's/files.txt:.*$/'
。这是一个相当简单的解决方案,我相信还有更好的解决方案。我求助于awk:
BEGIN { FS="/" }
{
for(i=1;i<NF;i++)
if (length($i) == 1)
a[NR]=a[NR]""$i
}
END {
for (i in a)
print a[i]
}
或者,如果变量中包含数据:
$ awk -f script.awk <<< $data
$awk-fscript.awk这不是一个好的/整洁的解决方案,但是bash参数扩展是一个强大的工具。所以忍不住举个例子
[]l="/home/ke/Desktop/b/o/r/files.txt:am.torrent"
[]m=${l##*Desktop/}
[]n=${m%%/files.txt*}
[]k=${n//\//}
[]echo $m
b/o/r/files.txt:am.torrent
[]echo $n
b/o/r
[]echo $k
bor
您可以看到bash在不使用任何外部程序的情况下一步一步地替换变量的效果有多好(顺便说一句,[]
是PS1,提示符)
有很多方法可以做到这一点。我在写第一篇文章的时候又得到了一篇
[]l="/home/ke/Desktop/b/o/r/files.txt:am.torrent"
[]m=${l/*Desktop\//}
[]n=${m/\/files.txt*/}
[]k=${n//\//}
[]echo $m
b/o/r/files.txt:am.torrent
[]echo $n
b/o/r
[]echo $k
bor
尝试更多,三个sed实例?你不觉得这太过分了吗?不,我不认为这太过分了,它会起作用的。但是,它也可以在一次sed调用中完成代码>,如下所示:sed-e的,*Desktop,,;s、 [^/]*$,,;s、 /,,g'
但是如果输入行是/home/q/Desktop/b/o/r/files.txt:am.torrent
?是的,这是一个问题,因为您会得到qbor
,但是OPs tetstdata中没有给出这种格式。我将等待一个完整的一般解决方案,直到OP要求这样做…但可能性是隐含的/home/ke/Desktop
表明他正在扫描用户homedir。这是不常见的,但是没有什么禁止使用单个字符的用户名。如果用户的home dir是一个问题,那么只需将for循环更改为for(i=4;iSorry没有跟踪原始问题,您可以在一段时间内逐行阅读即可使用此选项