awk 和 windows 路径反斜杠转义字符

awk 和 windows 路径反斜杠转义字符

这里我找到了一种从路径中提取基本名称的好方法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/.*\\//'

awksed解决方案的工作方式完全相同。他们用空字符串替换最后一个反斜杠之前的所有内容(包括)。

相关内容