这里我找到了一种从路径中提取基本名称的好方法awk
:
awk 'BEGIN{ var="Z:\201708021541\file name with spaces.123"; n=split(var,a,/\//); print a[n]}'
但对于反斜杠它不起作用,因为字符似乎被转义了,例如上面的输出看起来:
Z:�708021541
ile name with spaces.123
现在,有什么办法可以绕过 awk 吗?路径列在文件中,我不能(不想)预处理所有要转义的文件\
,所以我想知道有没有办法告诉 awk“不要转义”?
答案1
假设您正在尝试查找包含反斜杠的 Windows 路径名的文件名部分...
pathname='Z:\201708021541\file name with spaces.123'
filename=$(basename "${pathname//\\//}")
printf '%s\n' "$filename"
这将打印
file name with spaces.123
如果运行在bash
.
参数替换${pathname//\\//}
将 值中的所有反斜杠替换为正斜杠$pathname
,这意味着标准basename
实用程序可以对其进行处理。该basename
实用程序不关心路径的开头Z:
(它认为这是目录的名称)。
或者(更短,更便携):
pathname='Z:\201708021541\file name with spaces.123'
filename=${pathname##*\\}
printf '%s\n' "$filename"
在这里,${pathname##*\\}
将删除 中最后一个反斜杠之前的所有内容$pathname
。此参数替换是标准的,而第一个变体中使用的参数替换仅适用于某些 shell。
使用awk
:
printf '%s\n' "$pathname" | awk '{ sub(".*\\\\", "", $0); print }'
这四个反斜杠被两个反斜杠各转义一次,因为原因。
使用sed
:
printf '%s\n' "$pathname" | sed 's/.*\\//'
awk
和sed
解决方案的工作方式完全相同。他们用空字符串替换最后一个反斜杠之前的所有内容(包括)。