嗨 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 one-liner 实现这一点有一个要求 - 因此,不能使用 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
。
谢谢!
编辑:
正如@ThisSuitIsBlackNot 提到的,有两个非ascii 字符。因此,我想我只想在该字段的末尾添加 一个 空格,如果 至少 一个非 ascii 字符被命令删除。 有没有办法让这个额外的空间包含在同一个句子中,所以它也可以作为一个单行来完成?
编辑:
查看大量数据后,我可以看出非ascii字符总是成对出现,并且原始文件中的下一个字段(在运行单行之前)始终是右侧一个空格其他列。因此,我正在更改此问题的标题以符合要求:Perl one-liner to remove non-ascii characters and append a space in the field where the non-ascii characters are
最佳答案
取出2个非ascii,字段后加一个空格。
使用非 ascii 和 3 个空格作为分隔符对。
# s/[^[:ascii:]]{2}(.*?[ ]{3})/$1 /g
[^[:ascii:]]{2}
( .*? [ ]{3} )
Perl 测试用例
$/ = undef;
$str = <DATA>;
$str =~ s/[^[:ascii:]]{2}(.*?[ ]{3})/$1 /g;
print $str;
__DATA__
SPAM EATER PO BOX 5555 FAKE STREET
FOO BAR ìPO BOX 1234 LOLLERCOASTER VILLAGE
LOL MAN PO BOX 9876 NEXT DOOR
输出>>
SPAM EATER PO BOX 5555 FAKE STREET
FOO BAR PO BOX 1234 LOLLERCOASTER VILLAGE
LOL MAN PO BOX 9876 NEXT DOOR
关于regex - 如何删除非 ascii 字符并在非 ascii 字符使用 Perl 单行符的字段中附加一个空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22697017/