在bash shell中操作输出字符串

时间:2013-05-03 17:44:07

标签: 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

我该怎么做?

提前致谢。

4 个答案:

答案 0 :(得分:1)

这应该适合你:

your_script.sh | sed 's,.*Desktop,,' | sed 's,[^/]*$,,' | sed s,/,,g

或者,甚至更好:

your_script.sh | sed 's,.*Desktop,,;s,[^/]*$,,;s,/,,g'

答案 1 :(得分:0)

用sed。 echo '/home/ke/Desktop/b/o/r/files.txt:am.torrent' | sed -e 's+/++g' -e 's/^.*Desktop//' -e 's/files.txt:.*$//'。这是一个相当简单的解决方案,我相信还有更好的解决方案。

答案 2 :(得分:0)

我求助于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 input
bor
yunus

或者如果您的数据包含在变量中:

$ awk -f script.awk <<< $data

答案 3 :(得分:0)

它不是一个很好/整洁的解决方案,但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如何在不使用任何外部程序的情况下逐步替换变量(btw []是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

再试一次,