您好 Stack Overflow 社区,
我有以下问题。
我得到这个文件叫bad
,内容如下:
SPAM EATER PO BOX 5555 FAKE STREET
FOO BAR ìPO BOX 1234 LOLLERCOASTER VILLAGE
LOL MAN PO BOX 9876 NEXT DOOR
我想从中删除非 ascii 字符(在第二条记录的第二列的开头),以便获得一个没有奇怪字符且所有列对齐的文件。另外,需要使用以下方法来实现这一目标:Perl 一行代码- 所以不行awk
, sed
,或类似的命令可以使用。我尝试了以下操作,但第三列中少了一个空格:
$ perl -plne 's/[^[:ascii:]]//g' bad > bad.clean
$ cat bad.clean
SPAM EATER PO BOX 5555 FAKE STREET
FOO BAR PO BOX 1234 LOLLERCOASTER VILLAGE
LOL MAN PO BOX 9876 NEXT DOOR
我也尝试使用相同的单行代码,但这次用空格替换非 ASCII 字符。在这种情况下,记录最终在第二列中有两个额外的空格,在第三列中有一个额外的空格:
$ perl -plne 's/[^[:ascii:]]/ /g' bad > bad.clean.space
$ cat bad.clean.space
SPAM EATER PO BOX 5555 FAKE STREET
FOO BAR PO BOX 1234 LOLLERCOASTER VILLAGE
LOL MAN PO BOX 9876 NEXT DOOR
不知何故,非 ASCII 字符似乎占用 2 个字节而不是 1 个字节 -这是正确的,还是我错过了什么?
预期输出是这样的:
SPAM EATER PO BOX 5555 FAKE STREET
FOO BAR PO BOX 1234 LOLLERCOASTER VILLAGE
LOL MAN PO BOX 9876 NEXT DOOR
有没有一种方法,使用 Perl 单行代码,得到预期的结果?我正在考虑一种方法,在删除非 ASCII 字符后,在已进行更改的字段中添加一个空格,但我找不到方法。此外,非 ASCII 字符可以出现在任何字段中,而不仅仅是第二个字段中。
顺便说一下,一些可能有用的信息:这是一个AIX
机器, 运行Perl v5.8.8
.
谢谢你!
Edit:
正如 @ThisSuitIsBlackNot 提到的,有两个非 ASCII 字符。因此,我想我只想添加one空格到该字段的末尾,如果at least该命令会删除一个非 ASCII 字符。有没有办法让这个额外的空格包含在同一个句子中,这样它也可以作为单行完成?
Edit:
查看大量数据后,我可以看出非 ascii 字符始终成对出现,并且原始文件中的下一个字段(在运行单行之前)始终与其他列相比右侧有一个空格。因此,我正在更改此问题的标题以符合要求:Perl 单行删除非 ascii 字符并在非 ascii 字符所在的字段中附加一个空格