需要帮助使用 shell 脚本从文件中删除省略号 (...)

需要帮助使用 shell 脚本从文件中删除省略号 (...)

需要帮助使用 shell 脚本从文件中删除省略号 ( )。我sed以各种形式使用了命令,但在 Unix 机器中运行时它没有帮助。

使用了以下命令,但在 unix 服务器中运行它时没有帮助。

sed 's/…//g' $x >> $x.tmp
sed 's/\.\.\.//g' $x >> $x.tmp
awk '{gsub(/\.\.\./,"", $0); print}' "Input.TXT" > Output.txt
  • $x只是文件名。

  • 省略号的 ANSI 十六进制值为0x85Unicode 十六进制值为U+2026Unicode 编号为8230

  • 我尝试了该sed命令\u2026

    sed 's/\u2026//g' $x >> $x.tmp
    

    但这也没有帮助。

  • 输入示例:

    …ABC
    …DEF
    …123
    …456
    
  • 异常输出:

    ABC
    DEF
    123
    456
    

这是 unix 服务器中省略号(即三个点)无法正确读取的问题。如果我vi从 unix 终端(查看)原始文件,我会看到这些省略号为<85>灰色,而其他文本通常以黑色文本显示,如下所示。

<85>ABC
<85>DEF
<85>123
<85>456

答案1

不确定这是否是正确的答案,但值得一试。你说你已经尝试过sedwith ,但是如果它显示 a但实际上不是 a ,就像你看到的那样,vim那是字符0x85。试试这个,有效吗?:

sed 's/'$(printf "\x85")'//g' $x >> $x.tmp

答案2

只需将输入文件中的相同内容复制/粘贴到 sed 命令中,例如,如果我们使用您问题中的示例输入文件:

$ cat file
…ABC …DEF …123 …456
$ read -n1 chr < file
$ sed "s/$chr//g" file
ABC DEF 123 456

查看它们是什么(它们不是 3 .):

$ cat -A file
M-bM-^@M-&ABC M-bM-^@M-&DEF M-bM-^@M-&123 M-bM-^@M-&456$

$ echo sed 's/…//g' file | cat -A
sed s/M-bM-^@M-&//g file$

$ od -c file
0000000 342 200 246   A   B   C     342 200 246   D   E   F     342 200
0000020 246   1   2   3     342 200 246   4   5   6  \n
0000034

$ echo sed 's/…//g' file | od -c
0000000   s   e   d       s   / 342 200 246   /   /   g       f   i   l
0000020   e  \n
0000022

根据https://www.freecodecamp.org/news/ascii-table-hex-to-ascii-value-character-code-chart-2/<85>但是,如果你在编辑器中看到以下内容,则必须使用此字符作为省略号:

Decimal Hex Binary   HTML Number HTML Name Character Description
133     85  10000101 &#133;      &hellip;  …         Horizontal ellipsis

但是如果您只是将输入文件中的任何内容复制/粘贴到 sed 命令中,那么您并不关心它是什么:

$ printf '\x85ABC \x85DEF \x85123 \x85GHI\n' > file2

$ cat file2
▒ABC ▒DEF ▒123 ▒GHI
$ read -n1 chr < file2
$ sed "s/$chr//g" file2
ABC DEF 123 GHI

答案3

0x85 是Windows-125xU+2026 字符的编码,因此该文件可能采用 Microsoft 编码进行编码。

您可以使用以下方法删除该特定字节值:

perl -pi -e 's/\x85//g' that-file

但它可能仍会留下其他 Microsoft 编码的字符。

你还可以这样做:

tr -d '\205' < windows-file |
  iconv -f windows-1512 |
  dos2unix > unix-file

要删除这些字符,请将编码转换为 UTF-8(将 windows-1252 替换为该文件的实际编码),并修复行分隔符和其他 Microsoft 怪癖。

答案4

使用(以前称为 Perl_6)

~$ raku -pe 's:g/\x[2026]//;'  file

#OR:

~$ raku -pe 's:g/\x2026//;'  file

或者:

~$ raku -pe 'tr/\x2026//;'  file

#OR:

~$ raku -ne '.trans("\x2026" => "").put;'  file

这里的答案假设您有 ,即单个字符 U+2026。前三个答案使用-pe自动打印逐行标志。前两个答案 uses///和 show character 可以正确识别为\x[2026]\x2026。第三个答案的用法tr///与答案二类似。第四个答案-ne在例程中使用非自动打印逐行标志.trans,该例程采用pairs参数。

输入示例:

…ABC
…DEF
…123
…456
HORIZONTAL ELLIPSIS
Unicode: U+2026, UTF-8: E2 80 A6

示例输出:

ABC
DEF
123
456

HORIZONTAL ELLIPSIS
Unicode: U+2026, UTF-8: E2 80 A6

注意:您可以通过规范的 Unicode 名称来标识字符,而不是通过 Unicode 编号来标识字符,在本例中\c[HORIZONTAL ELLIPSIS],例如:

~$ raku -pe 's:g/\c[HORIZONTAL ELLIPSIS]//;'  file

使用规范的 Unicode 名称有助于提高代码可读性,例如在替换\c[APOSTROPHE]或 等标点符号时\c[QUOTATION MARK]

https://docs.raku.org/language/operators#s///_in-place_substitution
https://docs.raku.org/language/operators#tr///_in-place_transliteration
https://docs.raku.org/routine/trans
https://raku.org

相关内容