Bash:如何在字符串中获取匹配的完整子字符串?

时间:2017-10-18 13:38:36

标签: bash encoding utf-8 grep iso-8859-1

我有一个TXT文件,它是从Windows机器发出的,并以 ISO-8859-1 进行编码。我的Qt应用程序应该读取此文件,但QString仅支持UTF-8(我想避免使用QByteArray)。我在Qt找到了一种方法,所以我决定写一个小脚本来为我做转换。我完全按照我的情况编写它没有问题,但我想使它更通用 - 对于所有ISO-8859编码。

到目前为止,我有以下内容:

#!/usr/bin/env bash

output=$(file -i $1)

# If the output contains any sort of ISO-8859 substring
if echo "$output" | grep -qi "ISO-8859"; then
  # Retrieve actual encoding
  encoding=...
  # run iconv to convert
  iconv -f $encoding $1 -t UTF-8 -o $1
else
  echo "Text file not encoded in ISO-8859"
fi

我正在努力解决的问题是如何获得已在grep命令中成功配对的完整子字符串。

我们说我有helloworld.txt文件,并且在ISO-8859-15中进行了编码。在这种情况下

$~: ./fixEncodingToUtf8 helloworld.txt
stations.txt: text/plain; charset=iso-8859-15

将是终端中的output。在grep内部找到iso-8859(因为我使用-i标志,它以不区分大小写的方式处理输入)。此时脚本需要提取"提取"整个子字符串不仅仅是iso-8859而是iso-8859-15并将其存储在encoding变量中以便稍后使用iconv(当它出现时不区分大小写(p!))以编码的名称。)

注意:只需检索charset后面的值并将其用于encoding,即可进一步扩展上述脚本。然而,这有一个巨大的缺陷 - 如果输入文件的编码具有比UTF-8更大的字符集(简单示例:UTF-16和UTF-32),该怎么办?

3 个答案:

答案 0 :(得分:2)

您可以使用cutawk来获取此信息:

AWK:

encoding=$(echo $output | awk -F"=" '{print $2}')

切:

encoding=$(echo $output | cut -d"=" -f2)

我认为您可以直接将其提供给iconv命令并将脚本缩减为:

iconv -f $(file $1 | cut -d"=" -f2) -t UTF-8 file

答案 1 :(得分:2)

或使用下面的bash功能

$ str="stations.txt: text/plain; charset=iso-8859-15"
$ echo "${str#*=}"
iso-8859-15

保存在变量

$ myvar="${str#*=}"

答案 2 :(得分:1)

嗯,在这种情况下,这是毫无意义的......

$ file --brief --mime-encoding "$1"
iso-8859-15

档案手册

-b, --brief
        Do not prepend filenames to output lines (brief mode).
...
--mime-type, --mime-encoding
        Like -i, but print only the specified element(s).