如何获取,复制和替换文件中的非ascii字符与shell脚本?

ddrv8njm  于 2023-06-06  发布在  Shell
关注(0)|答案(3)|浏览(452)

我有一些问题,当我想取代非ascii字符从文件名。当我想复制文件做一些测试时,它回答我“无法打开'FileName'进行阅读:没有这样的文件或目录。所有非ascii文件都被一个“_”改变。你知道如何获得真实的的名字或者如何用一个好的shell脚本替换它吗?非常感谢。

p4rjhz4m

p4rjhz4m1#

要获取文件中的非ascii字符,用户可以使用以下sed语句。

sed 's/[^\d32-\d126]//g' <file_name>

上述指令将把输入文件中的非ASCII字符打印到stdout。通过向sed提供-i选项,用户可以从文件中删除ASCII字符。
要将非ascci字符替换为特定字符,用户可以使用以下语句。

sed 's/[\d32-\d126]/<replacing_char>/g' <file_name>
jm81lzqq

jm81lzqq2#

*如果*知道在创建文件的MacOS或Windows计算机上使用的编码,则可以使用convmv将该编码更改为您喜欢的编码:

将单个文件名从UTF 16重新编码为ASCII:

$ convmv -f utf8 -t ascii --notest <FILE NAME>

使用Linux标准化将整个目录从ISO 8859 -1递归地重新编码为UTF 16:

$ convmv -f iso8859-1 -t utf16 --nfc -r --notest <DIRECTORY NAME>

有关详细信息,请参见man convmvman charsets

增编:

如果您没有安装convmv,可以在its project page on freecode.com上安装。

cig3rfwq

cig3rfwq3#

到目前为止,所有前面的答案都解释了如何处理文件中的非ASCII * 内容 *,而不是实际的文件名。
尝试重命名文件,以在Bash中使用文本下划线字符替换任何非ASCII字符:

for file in *[!\ -~]*; do
    mv -i "$file" "${file//[! -~]/_}"
done

parameter expansion${variable//pattern/replacement}产生$variable的值,每个pattern的示例都替换为replacement;所以${file//[! -~]/_}用下划线替换$file中的每个非ASCII字符。这个特殊的构造是一个只支持Bash的特性,因此不能移植到sh、Zsh等。
要获得正确的POSIX可移植解决方案,请尝试使用sed执行替换。

for file in *[!\ -~]*; do
    mv -i "$file" "$(echo "$file" | sed 's/[^ -~]/_/g')"
done

然而,您对从cp等获得错误的抱怨似乎表明您实际上可能有一个引用问题。shell及其实用程序可以健壮地处理任何有效的文件名,但您需要知道When to wrap quotes around a shell variable(或者更广泛地说,任何用作文件名的字符串等)。参见https://mywiki.wooledge.org/BashFAQ/020

相关问题