【问题标题】:Bash cut not using stdin不使用标准输入的 Bash cut
【发布时间】:2018-11-28 13:22:45
【问题描述】:

我正在尝试获取文件路径中的最后 4 个目录以及文件名。我在具有 MinGW64 的 Windows 机器上执行此操作。显然这没有“rev”命令,所以我必须自己做:

#!/bin/bash
input="$1"
reverse=""

len=${#input}
for (( i=$len-1; i>=0; i-- ))
do 
  reverse="$reverse${input:$i:1}"
done

printf "$reverse"

如果我做一个简单的~/reverse.sh 'hello world' 输出:dlrow olleh

但是,如果我这样做: echo $(~/reverse.sh "/c/Users/myusername/5thfolder/4thfolder/3rdfolder/2ndfolder/1stfolder/this_is_my_target_file.sql") | cut -d"/" -f5- 我的输出是这样的: redlofht4/redlofht5/emanresuym/sresU/c/

我希望它能够反转输入文件名,然后将该输出 (lqs.elif_tegrat_ym_si_siht/redlofts1/redlofdn2/redlofdr3/redlofht4/redlofht5/emanresuym/sresU/c/) 传递给 cut。然后 cut 将采用前 5 个字段,我将得到输出 lqs.elif_tegrat_ym_si_siht/redlofts1/redlofdn2/redlofdr3/redlofht4/ 然后我可以再次反转以获得我需要的输出。

【问题讨论】:

  • 为什么将命令放在子shell中? $(...)。您的脚本打印到标准输出,因此您不需要回显。删除 echo 和 subshel​​l,输出应该通过管道传送到您的 cut 命令。
  • 您的代码似乎做对了。由于您在反向字符串中选择第 5 个字段,因此您不会获得完整的文件名。
  • 我的系统有一个rev 命令可以反转输入的每一行。但它来自一个“util-linux”包,所以 YMMV。
  • 供您参考,rev 可能在这里有用:echo "123" | rev 输出 321
  • 致所有说要使用“rev”的人——这显然是我应该做的。我就是不能——它不在我的系统上(它使用 MinGW64(如我所说))。它就在前几行中。

标签: linux bash git-bash cut mingw-w64


【解决方案1】:

您需要在中使用-f-5 而不是-f5-

... | cut -d"/" -f-5

您还可以使用sed 获取文件路径中的最后 4 个目录以及文件名:

echo "/fff/eee/ddd/ccc/bbb/aaa/file.sql" | sed -r 's|.*(/.*/.*/.*/.*/.*)$|\1|'

会输出

/ddd/ccc/bbb/aaa/file.sql

【讨论】:

  • 如果我没记错的话,OP 的问题是反转字符串。您输出不会反转文件夹名称。
  • 我对 sed 不太熟悉,所以我很感激。但是我的脚本试图是可移植的,如果文件夹结构不同,你的sed 不会按预期工作吗?但实际上我的问题是“为什么不 cut 接受反转的字符串?”对于 ChristophS - 早些时候 - 我把它放在一个子外壳中,因为这种行为已经以各种方式发生,这只是我尝试它的最新迭代。
  • 就是这样!谢谢你。啊。 -f-5 而不是 -f5 - 愚蠢的我!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多