需要帮助…
使用 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 十六进制值为
0x85
Unicode 十六进制值为U+2026
Unicode 编号为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
不确定这是否是正确的答案,但值得一试。你说你已经尝试过sed
with …
,但是如果它显示 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 … … … 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