在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没有跟踪原始问题,您可以在一段时间内逐行阅读即可使用此选项