假设我有这样的字符串:
/somefolder/andsubfolder/my_first_text.txt
/somefolder/andsubfolder/my_second_text.txt
我想创建一个循环来回应
my_first_text
my_second_text
经过一番研究,我发现该cut
命令无法做到这一点。我认为这awk
可能是一个选择,但我并不完全了解如何让它在这个例子中正常工作……所以任何帮助都将不胜感激。
答案1
我认为最简单的方法是使用字符串运算符.例如,如果:
str="/somefolder/andsubfolder/my_first_text.txt"
然后你可以使用类似这样的 somethink:
str=${str##*/}
echo ${str%.txt}
但是,您仍然可以借助cut
(rev
请参阅man cut
和man rev
了解更多信息):
echo $str | rev | cut -d/ -f1 | cut -d. -f 2- | rev
解决方案awk
如下:
echo $str | awk -F/ '{print $NF}' | awk -F. '{$NF=""}1'
答案2
为了避免使用任何外部程序(如 cut 或 awk),你可以使用 bash 字符串运算符进行连接,例如 if str="/somefolder/andsubfolder"
then
str="${str##*/}"; echo "${str%.txt}"
首先删除前导路径组件(最长前缀匹配*/
),然后删除.txt
后缀(最短后缀匹配*.txt
)
你也可以这样做
str="${str##*/}"; echo "${str%.*}"
删除任何单个.*
后缀,而不仅仅是.txt
答案3
尝试一下这个脚本
#!/bin/bash
abc=/somefolder/andsubfolder/my_first_text.txt
my_file=$(echo $abc | awk -F/ '{print $4}')
echo "$my_file"
这肯定会对你有帮助。