我正在编写一个脚本来读取.txt
文件并将结果存储在某处。
我需要缩短表达式:
str1/str2/str3/str4/str5
我只需要只str5
就是上面的内容。
我正在循环中逐行读取该文件while
。
如何缩短此类字符串?
答案1
该basename
实用程序将返回路径名的文件名部分。如果我们将您的字符串视为路径名,它将返回str5
:
string=str1/str2/str3/str4/str5
basename -- "$string"
以上输出str5
。即使$string
包含嵌入的换行符或以以下内容开头,这也可以工作-
:
string='-str1/str2/str3/str
4/str5'
basename -- "$string"
将结果存储basename
在变量中是通过普通命令替换完成的:
newstring=$( basename -- "$string" )
但命令替换带子全部尾随换行符:作为行分隔符输出的字符basename
,但也包括所有恰好位于 末尾的换行符$string
。
使用${var##pattern}
POSIX shell 的操作符可以避免这种情况(并且还可以节省分叉进程并执行单独的命令):
string='very/
strange
file name
'
newstring=${string##*/}
但会给$string
s 提供不同的值,例如/
或/some/dir/
答案2
这对你有用吗?
string="str1/str2/str3/str4/str5"
echo $string | awk -F'/' '{print $5}'
-F 用于指定分隔符
答案3
当您在 while 循环中读取文件时,您可以...
while IFS='/' read -r one two three four five junk; do
echo "$five"
done < yourfile
或者你可以使用cut
:
cut -d'/' -f5 yourfile
答案4
您可以使用简单的替换:
echo ${string##*/}
例如
string="str1/str2/str3/str4/str5"
echo ${string##*/}
将给出输出str5
。如果字符串有换行符,它也将起作用。
如果您有可变大小的字符串,即您不知道/
字符串包含多少个,它也将起作用。